Eu preciso trabalhar com um número binário.
Eu tentei escrever:
const x = 00010000;
Mas não deu certo.
Sei que posso usar um número hexadecimal com o mesmo valor 00010000
, mas quero saber se existe um tipo em C ++ para números binários e, se não houver, existe outra solução para o meu problema?
00010000
é octal, certo? (E a sua declaração está faltando um tipo.)0b
aparecem apenas no C ++ 14). Eles são projetados para serem inequívocos.Respostas:
Você pode usar
BOOST_BINARY
enquanto aguarda C ++ 0x. :)BOOST_BINARY
sem dúvida tem uma vantagem sobre a implementação do modelo, na medida em que também pode ser usado em programas C (é 100% direcionado ao pré-processador).Para fazer o inverso (ou seja, imprimir um número em formato binário), você pode usar a
itoa
função não portátil ou implementar a sua própria .Infelizmente, você não pode fazer a formatação da base 2 com fluxos STL (já
setbase
que apenas honrará as bases 8, 10 e 16), mas você pode usar umastd::string
versãoitoa
ou (a mais concisa, mas marginalmente menos eficiente)std::bitset
.produz:
Leia também Os Formadores de Cordas da Manor Farm, de Herb Sutter, para uma discussão interessante.
fonte
int main() { cout << bitset<8>(42); }
bitset
dica, eu já corrigi um pouco sobresetbase
antes de ver seu comentário.Se você estiver usando o GCC, poderá usar uma extensão do GCC (incluída no padrão C ++ 14 ) para isso:
fonte
Você pode usar literais binários. Eles são padronizados em C ++ 14. Por exemplo,
Suporte no GCC
O suporte no GCC começou no GCC 4.3 (consulte https://gcc.gnu.org/gcc-4.3/changes.html ) como extensões da família de idiomas C (consulte https://gcc.gnu.org/onlinedocs/gcc/ C-Extensions.html # C-Extensions ), mas desde o GCC 4.9, agora ele é reconhecido como um recurso do C ++ 14 ou como uma extensão (consulte Diferença entre literais binários do GCC e C ++ 14? )
Suporte no Visual Studio
O suporte no Visual Studio foi iniciado no Visual Studio 2015 Preview (consulte https://www.visualstudio.com/news/vs2015-preview-vs#C++ ).
fonte
O dígito mais à esquerda do literal ainda precisa ser 1, mas mesmo assim.
fonte
binary<10>::value == binary<010>::value
e alguns verificação de erros)Alguns compiladores (geralmente aqueles para microcontroladores ) possuem um recurso especial implementado no reconhecimento de números binários literais pelo prefixo "0b ..." que precede o número, embora a maioria dos compiladores (padrões C / C ++) não possuam esse recurso e, se é o caso, aqui está minha solução alternativa:
Desvantagens (não são grandes):
Vantagens :
spending processor time
em operações inúteis (like "?.. :..", "<<", "+"
) ao programa executável (pode ser executado centenas de vezes no aplicativo final);"mainly in C"
compiladores e C ++ (template+enum solution works only in C++ compilers
);"enum solution" (usually 255 = reach enum definition limit)
, diferentemente, limitações "constantes literais", no compilador permite números maiores;several header files
(na maioria dos casos, não são facilmente legíveis e compreensíveis, e tornam o projeto desnecessariamente confuso e estendido, como o uso"BOOST_BINARY()"
);fonte
B_0100
não é usado (em vez de0100
)? Como em egchar b = BYTE(0100,0001);
._B2H
função de pré - processador.Este tópico pode ajudar.
Funciona! (Todos os créditos vão para Tom Torfs.)
fonte
##
operador do pré-processador cola os tokens juntos. Portanto, nesse caso, se você ligarHEX__(10)
, ele se expandirá para0x10LU
.Como já foi respondido, os padrões C não têm como escrever diretamente números binários. Existem extensões do compilador, no entanto, e aparentemente o C ++ 14 inclui o
0b
prefixo para o binário. (Observe que esta resposta foi publicada originalmente em 2010.)Uma solução popular é incluir um arquivo de cabeçalho com macros auxiliares . Uma opção fácil também é gerar um arquivo que inclua definições de macro para todos os padrões de 8 bits, por exemplo:
Isso resulta em apenas 256
#define
s e, se forem necessárias constantes binárias maiores que 8 bits, essas definições poderão ser combinadas com turnos e ORs, possivelmente com macros auxiliares (por exemplo,BIN16(B00000001,B00001010)
). (Ter macros individuais para cada valor de 16 bits, quanto mais 32 bits, não é plausível.)Obviamente, a desvantagem é que essa sintaxe requer a gravação de todos os zeros à esquerda, mas isso também pode tornar mais claro o uso de configurações de sinalizadores de bits e conteúdo de registros de hardware. Para uma macro de função que resulta em uma sintaxe sem essa propriedade, consulte o
bithacks.h
link acima.fonte
long long int
?A mentalidade de excesso de engenharia do C ++ já está bem explicada nas outras respostas aqui. Aqui está minha tentativa de fazê-lo com uma mentalidade C, mantenha-o-simples-ffs:
fonte
C não possui notação nativa para números binários puros. Sua melhor aposta aqui seria octal (por exemplo
07777
) de hexadecimal (por exemplo0xfff
).fonte
Você pode usar a função encontrada nesta pergunta para obter até 22 bits em C ++. Aqui está o código do link, devidamente editado:
Então você pode fazer algo parecido
binary<0101011011>::value
.fonte
A menor unidade com a qual você pode trabalhar é um byte (que é do
char
tipo). Você pode trabalhar com bits usando operadores bit a bit.Quanto aos literais inteiros, você só pode trabalhar com números decimais (base 10), octal (base 8) ou hexadecimais (base 16). Não há literais binários (base 2) em C nem C ++.
Os números octais são prefixados
0
e os números hexadecimais são prefixados0x
. Números decimais não têm prefixo.No C ++ 0x, você poderá fazer o que quiser por meio de literais definidos pelo usuário .
fonte
<shameless_plug>
stackoverflow.com/questions/2611764#2611883</shameless_plug>
0b00101010
como uma conveniência. O SDCC é um deles, e tenho certeza de que existem outros também. (Edit: Hah, chegou antes de mim, @Joey!)Você também pode usar montagem embutida como esta:
Ok, pode ser um pouco exagerado, mas funciona.
fonte
Com base em outras respostas, mas esta rejeitará programas com literais binários ilegais. Os zeros à esquerda são opcionais.
Exemplo:
fonte
O "tipo" de um número binário é igual a qualquer número decimal, hexadecimal ou octal:
int
(ou mesmo char, short, long long).Quando você atribui uma constante, não pode atribuí-la com 11011011 (curiosa e infelizmente), mas pode usar hex. Hex é um pouco mais fácil de traduzir mentalmente. Pedaços de mordidelas (4 bits) e traduza para um caractere em [0-9a-f].
fonte
Você pode usar um conjunto de bits
fonte
Estendi a boa resposta dada por @ renato-chandelier, garantindo o apoio de:
_NIBBLE_(…)
- 4 bits, 1 mordidela como argumento_BYTE_(…)
- 8 bits, 2 mordidelas como argumentos_SLAB_(…)
- 12 bits, 3 mordidelas como argumentos_WORD_(…)
- 16 bits, 4 mordidelas como argumentos_QUINTIBBLE_(…)
- 20 bits, 5 petiscos como argumentos_DSLAB_(…)
- 24 bits, 6 petiscos como argumentos_SEPTIBBLE_(…)
- 28 bits, 7 petiscos como argumentos_DWORD_(…)
- 32 bits, 8 petiscos como argumentosNa verdade, não tenho tanta certeza sobre os termos "quintebble" e "septibble". Se alguém conhece alguma alternativa, por favor me avise.
Aqui está a macro reescrita:
E aqui está o exemplo de Renato:
fonte
Basta usar a biblioteca padrão em C ++:
Você precisa de uma variável do tipo
std::bitset
:Neste exemplo, eu armazenei a forma binária de
10
inx
.8ul
define o tamanho dos seus bits, então7ul
significa sete bits e assim por diante.fonte
C ++ fornece um modelo padrão chamado
std::bitset
. Experimente se quiser.fonte
Você pode tentar usar uma matriz de
bool
:fonte