J'ai besoin de travailler avec un nombre binaire.
J'ai essayé d'écrire:
const x = 00010000;
Mais ça n'a pas marché.
Je sais que je peux utiliser un nombre hexadécimal qui a la même valeur que 00010000
, mais je veux savoir s'il existe un type en C ++ pour les nombres binaires et s'il n'y en a pas, y a-t-il une autre solution à mon problème?
00010000
c'est octal, non? (Et il manque un type dans votre déclaration.)0b
n'apparaissent que dans C ++ 14). Ils sont conçus pour être sans ambiguïté.Réponses:
Vous pouvez utiliser
BOOST_BINARY
en attendant C ++ 0x. :) aBOOST_BINARY
sans doute un avantage sur l'implémentation de modèle dans la mesure où il peut également être utilisé dans les programmes C (il est 100% piloté par un préprocesseur).Pour ce faire l'inverse (c. -à imprimer un nombre sous forme binaire), vous pouvez utiliser la non-portable
itoa
fonction ou mettre en œuvre votre propre .Malheureusement, vous ne pouvez pas faire de formatage de base 2 avec des flux STL (puisque
setbase
ne respectera que les bases 8, 10 et 16), mais vous pouvez utiliser unestd::string
version deitoa
, ou (la plus concise, mais légèrement moins efficace)std::bitset
.produit:
Lisez également The String Formatters of Manor Farm de Herb Sutter pour une discussion intéressante.
la source
int main() { cout << bitset<8>(42); }
bitset
tuyau, j'ai déjà corrigé le problèmesetbase
avant de voir votre commentaire.Si vous utilisez GCC, vous pouvez utiliser une extension GCC (qui est incluse dans la norme C ++ 14 ) pour cela:
la source
Vous pouvez utiliser des littéraux binaires. Ils sont standardisés en C ++ 14. Par exemple,
Assistance dans GCC
La prise en charge de GCC a commencé dans GCC 4.3 (voir https://gcc.gnu.org/gcc-4.3/changes.html ) en tant qu'extensions de la famille de langages C (voir https://gcc.gnu.org/onlinedocs/gcc/ C-Extensions.html # C-Extensions ), mais depuis GCC 4.9, il est maintenant reconnu comme une fonctionnalité C ++ 14 ou une extension (voir Différence entre les littéraux binaires GCC et ceux C ++ 14? )
Prise en charge dans Visual Studio
La prise en charge dans Visual Studio a démarré dans Visual Studio 2015 Preview (voir https://www.visualstudio.com/news/vs2015-preview-vs#C++ ).
la source
Le chiffre le plus à gauche du littéral doit toujours être 1, mais néanmoins.
la source
binary<10>::value == binary<010>::value
et quelques vérifications d'erreurs)Quelques compilateurs (généralement ceux des microcontrôleurs ) ont une fonction spéciale implémentée dans la reconnaissance des nombres binaires littéraux par le préfixe "0b ..." précédant le nombre, bien que la plupart des compilateurs (normes C / C ++) ne disposent pas d'une telle fonctionnalité et si elle c'est le cas, voici ma solution alternative:
Inconvénients (ce n'est pas si gros):
Avantages :
spending processor time
en opérations inutiles (like "?.. :..", "<<", "+"
) vers le programme exécutable (il peut être effectué des centaines de fois dans l'application finale);"mainly in C"
compilateurs et C ++ (template+enum solution works only in C++ compilers
);"enum solution" (usually 255 = reach enum definition limit)
, différemment, des limitations de "constante littérale", dans le compilateur autorise des nombres plus grands;several header files
(dans la plupart des cas, pas facilement lisibles et compréhensibles, et rendent le projet inutilement confus et étendu, comme cela en utilisant"BOOST_BINARY()"
);la source
B_0100
n'est-il pas utilisé (au lieu de0100
)? Comme par exemplechar b = BYTE(0100,0001);
._B2H
fonction de préprocesseur.Ce fil peut aider.
Ça marche! (Tous les crédits vont à Tom Torfs.)
la source
##
opérateur du préprocesseur colle les jetons ensemble. Donc, dans ce cas, si vous appelezHEX__(10)
, il se développe en0x10LU
.Comme déjà répondu, les standards C n'ont aucun moyen d'écrire directement des nombres binaires. Il existe cependant des extensions de compilateur et apparemment C ++ 14 inclut le
0b
préfixe pour binary. (Notez que cette réponse a été publiée à l'origine en 2010.)Une solution de contournement populaire consiste à inclure un fichier d'en-tête avec des macros d'assistance . Une option simple consiste également à générer un fichier qui comprend des définitions de macros pour tous les modèles 8 bits, par exemple:
Cela ne donne que 256
#define
s, et si des constantes binaires supérieures à 8 bits sont nécessaires, ces définitions peuvent être combinées avec des décalages et des OR, éventuellement avec des macros d'assistance (par exemple,BIN16(B00000001,B00001010)
). (Avoir des macros individuelles pour chaque valeur de 16 bits, sans parler de 32 bits, n'est pas plausible.)Bien sûr, l'inconvénient est que cette syntaxe nécessite l'écriture de tous les zéros non significatifs, mais cela peut également le rendre plus clair pour des utilisations telles que la définition d'indicateurs de bits et le contenu des registres matériels. Pour une macro de type fonction résultant en une syntaxe sans cette propriété, voir
bithacks.h
lien ci-dessus.la source
long long int
?L'état d'esprit de sur-ingénierie C ++ est déjà bien pris en compte dans les autres réponses ici. Voici ma tentative de le faire avec un état d'esprit C, keep-it-simple-ffs:
la source
C n'a pas de notation native pour les nombres binaires purs. Votre meilleur pari ici serait octal (par exemple
07777
) ou hexadécimal (par exemple0xfff
).la source
Vous pouvez utiliser la fonction trouvée dans cette question pour obtenir jusqu'à 22 bits en C ++. Voici le code du lien, correctement édité:
Vous pouvez donc faire quelque chose comme
binary<0101011011>::value
.la source
La plus petite unité avec laquelle vous pouvez travailler est un octet (qui est de
char
type). Vous pouvez cependant travailler avec des bits en utilisant des opérateurs au niveau du bit.Comme pour les littéraux entiers, vous ne pouvez travailler qu'avec des nombres décimaux (base 10), octaux (base 8) ou hexadécimaux (base 16). Il n'y a pas de littéraux binaires (base 2) en C ni en C ++.
Les nombres octaux sont préfixés par
0
et les nombres hexadécimaux sont préfixés par0x
. Les nombres décimaux n'ont pas de préfixe.En C ++ 0x, vous pourrez faire ce que vous voulez en passant via des littéraux définis par l' utilisateur .
la source
<shameless_plug>
stackoverflow.com/questions/2611764#2611883</shameless_plug>
0b00101010
pour plus de commodité. Le SDCC en est un, et je suis sûr qu'il y en a d'autres qui le font aussi. (Edit: Hah, bat-moi dessus, @Joey!)Vous pouvez également utiliser l'assemblage en ligne comme ceci:
D'accord, c'est peut-être un peu exagéré, mais cela fonctionne.
la source
Basé sur d'autres réponses, mais celle-ci rejettera les programmes avec des littéraux binaires illégaux. Les zéros non significatifs sont facultatifs.
Exemple:
la source
Le "type" d'un nombre binaire est le même que tout nombre décimal, hexadécimal ou octal:
int
(ou même char, short, long long).Lorsque vous attribuez une constante, vous ne pouvez pas l'affecter avec 11011011 (curieusement et malheureusement), mais vous pouvez utiliser hex. Hex est un peu plus facile à traduire mentalement. Couper en quartets (4 bits) et traduire en un caractère en [0-9a-f].
la source
Vous pouvez utiliser un ensemble de bits
la source
J'ai prolongé la bonne réponse donnée par @ renato-chandelier en assurant le soutien de:
_NIBBLE_(…)
- 4 bits, 1 quartet comme argument_BYTE_(…)
- 8 bits, 2 quartets comme arguments_SLAB_(…)
- 12 bits, 3 grignotages comme arguments_WORD_(…)
- 16 bits, 4 grignotages comme arguments_QUINTIBBLE_(…)
- 20 bits, 5 grignotages comme arguments_DSLAB_(…)
- 24 bits, 6 grignotages comme arguments_SEPTIBBLE_(…)
- 28 bits, 7 grignotages comme arguments_DWORD_(…)
- 32 bits, 8 quartets comme argumentsJe ne suis pas si sûr des termes «quintibble» et «septibble». Si quelqu'un connaît une alternative, faites-le moi savoir.
Voici la macro réécrite:
Et voici l'exemple d'utilisation de Renato:
la source
Utilisez simplement la bibliothèque standard en C ++:
Vous avez besoin d'une variable de type
std::bitset
:Dans cet exemple, j'ai stocké la forme binaire de
10
inx
.8ul
définit la taille de vos bits,7ul
signifie donc sept bits et ainsi de suite.la source
C ++ fournit un modèle standard nommé
std::bitset
. Essayez-le si vous le souhaitez.la source
Vous pouvez essayer d'utiliser un tableau de
bool
:la source