Newsgroup: it.comp.os.linux.development
Titolo: costante binarica: sintassi?

Ciao,
so che il problema e' banalissimo,
ma oltre che ai socket,alla seriale,alle Qt etc..
mi trovo a dover inserire una costante binaria nel codice:
0b0001000 ... non compila!
dov'e' l'inghippo?
(gcc 3.2.2 su linux)

 0b0001000 ... non compila!
a suo tempo mi sono incartato anch'io. Chiedendo su it.comp.lang.c mi
hanno detto che lo standard C non prevede la definizio dei valori come
costanti binarie.

 costanti binarie.
...e la rete e' piena di listati con 0b0101011 ...
ma li hanno mai compilati ?!
il mio era un problema di leggibilita'.
"il quinto bit" ed "il sesto bit" scritti come 0x10 e 0x20 (o 16 e 32)
non mi piacevano.
ho temporaneamente, e credo a questo punto definitivamente,
risolto con (1<<4) e (1<<5) , cosi' quando tra un po' di mesi
riprendero' in mano il codice non dovro de-trasformare costanti
esadecimali...


Io al codice esadecimale ci ho fatto abbastanza l'occhio (soprattutto finche'
si tratta di potenze di 2 :-).
In casi piu' complessi definisco una macro.
Alessandro.

 non mi piacevano.
se il problema è la leggibilità perchè non metti un commento accanto alle
costanti esadecimali dove indichi il valore binario? secondo me è molto
meglio e meno macchinoso di usare 1<<x..
IMO
-- 
[Filippo...........................]
[Linux User #342745................]
        ==[...penguin powered...]==

 meglio e meno macchinoso di usare 1<<x..
perche' se devo modificarlo, devo riaprire
kcalc, scrivere 100000 (nuovo valore) in binario,
trasformalo in hex per avere il nuovo valore :-(

 ha scritto nel
messaggio news:4udt22-...@news.ngi.it...

scusa la spacconata:
lezioncina di matematica:
in esadecimale ogni valore corrisponde a 4 bit... quindi per esempio:
0xcacca in binario sitraduce così: 1100 1010 1100 1100 1010
mi spiego meglio:
c = 12 in decimale quindi in binario 1100
a = 10 in decimale quindi in binario 1010
e così via.....
di solito le operazioni che vuoi fare tu si fanno in questo modo (supponiamo
di gestire costanti a 8 bit):
#define BIT0    0x01 //00000001
#define BIT1    0x02 //00000010
#define BIT2    0x04 //00000100
#define BIT3    0x08 //00001000
#define BIT4    0x10 //00010000
#define BIT5    0x20 //00100000
#define BIT6    0x40 //01000000
#define BIT7    0x80 //10000000
poi se ne vuoi più di uno abilitato fai ad esempio:
int z;
z = BIT5|BIT1; si traduce -----> 00100010
spero di essere stato chiaro?????!!!!
ciao ed auguri
PS:
ti conviene magari fare:
#define CONST_BIN      BIT5|BIT1

 #define BIT1    0x02 //00000010
si', il #define e' un'idea piu' buona di (1<<X).
Ciononostante, rimane il mio stupore che in un linguaggio come il C...
non si possa scrivere una costante binaria!
Dovrebbe essere stata la prima cosa da fare!

 
se hai la possibilità di programmare in c++, potresti sempre dare un 
occhio alla classe std::bitset, che mi sembra fare al caso tuo.
-- 
There are better things in life than alcohol, but alcohol makes up for 
not having them. - Terry Pratchett.

 non si possa scrivere una costante binaria!
La codifica binaria e` troppo vicina all'hardware per essere usata in un
linguaggio come il C. Mi spiego meglio, se scrivo 10101011 che numero
volgio indicare? La stringa e` LE oppure BE? E` un numero signed? Con
complemento a 1? a 2? Oppure magnitudine/segno?
Certo, si potrebbe decidere una certa convenzione ma si sconterebbero
tutti gli utilizzatori di piattaforme che usano codifiche diverse (ed il
C ne supporta un bel po').
Scrivere 0xabcd oppure anche 0123 non lascia spazio ad ambiguita`, cosi` 
come costruire il numero con una serie di OR (vedi sopra) oppure di
shift.
Luca
-- 
Home: 
http://kronoz.cjb.net
"Di tutte le perversioni sessuali, la castita` e` la piu` strana".
Anatole France

> Scrivere 0xabcd oppure anche 0123 non lascia spazio ad ambiguita`
beh, se scrivo
int i = 0xFF FF FF FE;
ho scritto -2 su una piattaforma a 32 bit.
ma su una piattaforma a 64 bit ?
(sto assumendo che su una piattaforma a 64 bit
l'intero sia nativamente di 64 bit. non ne sono sicuro,
non mi sono ancora informato).
Mi sembra che, pur apprezzando tutta la casistica che hai nominato,
anche il decidere semplicemente se un numero sia positivo o negativo
in esadecimale non sia univocamente determinato dal leggere il codice.