Newsgroup: it.comp.lang.c
Titolo: Determinare il valore di un bit

Ciao a tutti,
Studio da poco il C ed ho un problema che non riesco a risolvere.. ed
avrei bisogno di un'aiutino :p
In poche parole devo determinare il valore di un certo bit in una
variabile intera.
Ad esempio se dovessi determinare il settimo bit da destra farei:
    bit=valore/(1<<6);
    bit=bit%2;
E avrei il valore 0 o 1 nella variabile "bit".
Avevo pensato anche ad un altro modo ma utilizzando lo shif a destra.
Il problema è che per svolgere questo esercizio NON posso utilizzare
nè LA DIVISIONE nè SHIFT A DESTRA (consentiti in pratica & | ^ + * -
e <<)!
Qualcuno ha qualche suggerimento?
Grazie già da ora :)
--
Vinz

 e <<)!
bitsettato = ((valore & (1<<6)) > 0);
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 bitsettato = ((valore & (1<<6)) > 0);
Però lo shift verso sinistra, non garantisce che gli altri bit siano
impostati a zero come invece avviene per quello a destra!!
Quindi il risultato potrebbe non essere corretto!

 Quindi il risultato potrebbe non essere corretto!
A me sembra di si. (A parte che il L. si sbaglia di rado).
valore & (1<<6)  puo' avere solo 2 valori possibili
0  oppure (1<<6) a seconda del fatto che il bit corrispondente
sia o meno settato nella rappresentazione binaria di valore.
Alternativamente, se preferisci, puoi scrivere
bit = (valore & (1<<6) ? 1 : 0);
ciao,
g.

 dei bit a 0 a destra sarebbe di fatto inutilizzabile. 
So cosa dici...ma almeno sul libro che studiai tanti anni fa, diceva che
non c'era sicurezza sull'impostazione dei bit a zero; ovviamente non è
una certezza e mi fa piacere approfondire la cosa! ;-)


Potrei sbagliare, perche' sono anni che non leggo un manuale o uno 
standard, ma forse quello che poteva creare dei
problemi era lo shift di numeri negativi, per problemi
legati alla rappresentazione.
Se il numero e' positivo non dovrebbero esserci problemi.
Aspetto conferme o smentite dai guru.
g.

 impostati a zero come invece avviene per quello a destra!!
Semmai è il contrario...


 
Sorry...hai ragione!
Quello a sinistra è "corretto" nell'impostare i bit a zero.
Quello a destra potrebbe non settarli nel caso di valori
non segnati come unsigned (come notava Giovanni Resta).

 Qualcuno ha qualche suggerimento?
Tanto per didattica:
bitDaControllare = 7 /* o altro */
valoreDaControllare = pow(2, bitDaControllare - 1)
ret = 255 & valoreDaControllare
Ciao a tutti


no, mi spiace. Hai cannato. Rileggiti.
ciao,
v.

 e <<)!
#include <stdio.h>
int main() {
   int a = 7;
   union {
      int i;
      struct {
         unsigned char b0:1;
         unsigned char b1:1;
         unsigned char b2:1;
         unsigned char b3:1;
         unsigned char b4:1;
         unsigned char b5:1;
         unsigned char b6:1;
         unsigned char b7:1;
      } bit;
   }x;
 
   x.i = a;
   printf("() %d = %d%d%d%d%d%d%d%d \n", x.i,
         x.bit.b7,
         x.bit.b6,
         x.bit.b5,
         x.bit.b4,
         x.bit.b3,
         x.bit.b2,
         x.bit.b1,
         x.bit.b0);
 
   return 0;
}

 
non ha pensato a crearti una maschera?
es.
mask=0x7FFFFF;
valorebit=num&mask;

> ret = 255 & valoreDaControllare
Non credo proprio!!

 Non credo proprio!!
Nel senso che è solo a scopo didattico e non pratico!!


Visto il pubblico esigente, ho reso "pratico" l'algoritmo:
Dim bitDaControllare As Integer
Dim valoreDaControllare As Integer
Dim ret As Integer, val As Integer
Let val = 17 ' numero su cui effettuare il controllo
Let bitDaControllare = 5 ' bit da controllare
Let valoreDaControllare = 2 ^ (bitDaControllare - 1) ' calcolo del 
valore corrispondente al bit (in C: pow(2, bitDaControllare - 1) )
Let ret = val And valoreDaControllare ' controllo sul bit scelto: 0 
spento, diverso da 0 attivo
P.S. è in VB ma ovviamente può essere convertito in qualsiasi linguaggio


No, nel senso che forse non si capisce bene cosa stai facendo:
bitDaControllare = 7 /* o altro */
valoreDaControllare = pow(2, bitDaControllare - 1)
ret = 255 & valoreDaControllare;
quale e' l'input del quale vogliamo testare il settimo bit ?
La costante 255 ? Spiega meglio.
((a parte il fatto opinabile che pow e' una funzione matematica
definita in math.h e che opera su numeri double (e che quindi il suo
risultato, una volta convertito in intero, potrebbe essere di 1 
inferiore al risultato esatto).))
ciao,
g.

 inferiore al risultato esatto).))
Puoi benissimo convertire la funzione pow in un ciclo for e operare su
interi. ;-)

 inferiore al risultato esatto).))
...
E perche´  mai ? Va bene tutti i problemi della rappresentazione 
floating point. Ma per le potenze positive di due non ci sono 
approssimazioni in giro!
Giorgio

 approssimazioni in giro!
Giusto! ;-)


In linea di principio pow utilizzera' un metodo generico di elevamento
a potenza basato su una estrazione di logaritmo e una esponenziazione.
Non so se va a vedere se gli argomenti sono interi per utilizzare un
metodo alternativo.
Quindi in generale potrebbe ottenere risultati lievemente errati
anche con potenze intere.
Nel caso specifico delle potenze di due e' verosimile che anche se
usa un algoritmo generico log-exp, la base di questo log ed exp sia 2.
In tal caso i risultati intermedi sono interi e quindi anche il 
risultato finale.
Quindi e' verosimile che non ci siano problemi e che pow(2,x) dia sempre
un risultato intero e corretto.
Come regola generale pero' e' meglio diffidare di operazioni in floating
point che "dovrebbero" dare risultati interi, perche' spesso non lo
fanno.
ciao,
g.

Ora con il vostro aiuto ho finalmente capito! :)
Grazie 1000 a tutti!

 P.S. è in VB ma ovviamente può essere convertito in qualsiasi linguaggio
Se ti azzardi un'altra volta a spedire del codice VB in un ng che tratta
di C ti prendo a calci nel culo ! ;-)


 di C ti prendo a calci nel culo ! ;-)
GULP...hai ragione scusa!!
ma sai il vb permette di eseguire il codice senza salvare nessun file
o altro...cosě ho preso in considerazione lui; sai quanto ci mettevo se
lo volevo fare con VC++ o C++Builder?!?!?
Ottomila file per un file di codice... :-)

 o altro...
Sě, questa č una caratteristica che ha anche C++ Builder.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/