[C] Settare i bit di una variabile intera

mtx4
Ciao, propongo un quesito.
L' esercizio richiede di fare questo:
Settare i bit di una variabile intera in modo che assuma la seguente configurazione:
a) 01011111 11110101 01011111 11110101
b) 11110000 11110000 11110000 11110000
Si effettuino assegnazioni a variabili con valori minori di 256.

Innanzitutto vorrei capire se il valore della variabile deve essere arbitrario (immesso da tastiera), o se posso sceglierne uno in modo opportuno. Nel primo caso credo sia proprio impossibile farlo.
Detto questo, se l'esercizio dice di settare la variabile, immagino voglia dire che dopo un opportuno frammento di codice i 4 byte della variabile debbano assumere quella configurazione.
Ve lo chiedo perché io ho svolto l'esercizio, ma non per far assumere alla variabile quel valore, ma per far sì che quel valore venga stampato a schermo. Se questa interpretazione non è corretta, allora al momento non ho idea di come poter procedere, potreste darmi qualche suggerimento?

Vi lascio comunque il codice che ho scritto, così che possiate prendermi un po' per stupidotto :-D

/* esame esercizio 2 */

#include <stdio.h>
void displaybits(unsigned);

main()
{ int i;	
	unsigned pattern;
	unsigned intero = 255;	
	
for(i = 3; i >=0 ; i--)
	{   if (i % 2 == 0) 
	   { pattern = intero & '\xF5';} 
	   else 
	   { pattern = intero & '\137'; } 
	   
	   displaybits(pattern);
	   pattern = 0;
    }
}

void displaybits(unsigned x)
{	int i;
	unsigned mask = 1 << 7;
	
	for(i = 1; i <= 8; i++)
		  { if (x & mask) printf("1");     
		    else printf("0");
		    x = x << 1;
		  
		    if ((i % 8) == 0) printf(" "); }  	
}

Risposte
vict85
Dove hai trovato l'esercizio? Non vedo trattare due aspetti importanti: l'endiannes del sistema http://en.m.wikipedia.org/wiki/Endianness e il fatto che un intero possa non essere di 32 bit. Per un problema che vuole analizzare modifiche a livello di byte mi sembra grave.
Riguardo alla stampa, il printf ammette di stampare in formato ottale ed esadecimale (un unsigned).

Per il primo problema dovresti considerare i due casi, per il secondo ti basta usare i tipi di inttypes.h
Comunque lo standard afferma che il main deve tornare int.

mtx4
Era un esercizio proposto dal mio Professore, ma gli argomenti di cui parli non sono stati oggetto del corso, o meglio, forse si è accennato al fatto che un intero possa non essere di 32 bit, ma l'endiannes non l'avevo mai sentito prima.
Detto ciò, ammesso che io scelga una variabile intera minore di 256 che sia rappresentata da 32 bit dalla macchina, come posso fargli assumere quelle due configurazioni ?
Nel listato, di fatto, non ho settato i bit della variabile, ho semplicemente combinato un po' le cose per far apparire sullo schermo quella sequenza, e suppongo sia un modo di procedere errato, perchè non soddisfa la richiesta.
Io dovrei in qualche modo, prima far assumere alla variabile la data sequenza, poi stamparla con la funzione displaybits, che mostri 32 bit e non 8 alla volta.
Ok per il ritorno del main (lo ometto sempre), non conosco invece la libreria di cui parli.

apatriarca
L'esercizio così com'è è poco chiaro. Immagino ci possano essere due soluzioni:
1. Usare un cast ad array di byte e accedere ai singoli byte in questo modo. Questa soluzione dipende dall'endianness del sistema.
2. Usare 4 variabili intere separate per ogni byte e usare degli shift per portare i byte nella posizione corretta. A quel punto si possono unire con un OR (o XOR). Il problema è che queste variabili avranno valori maggiori di 256 al loro interno e non ho capito bene la limitazione del professore.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.