Por que std :: bitset expõe bits de maneira little-endian?
Quando eu usostd::bitset<N>::bitset( unsigned long long )
isso constrói um conjunto de bits e quando eu acessá-lo através dooperator[]
, os bits parecem ser ordenados da maneira little-endian. Exemplo:
std::bitset<4> b(3ULL);
std::cout << b[0] << b[1] << b[2] << b[3];
impressões1100
ao invés de0011
ou seja, o final (ou LSB) está no pequeno endereço (inferior), índice 0.
Olhando para o padrão, diz
inicializando as primeiras posições de bits M nos valores de bits correspondentes emval
Os programadores pensam naturalmente nos dígitos binários de LSB para MSB (da direita para a esquerda). Então oprimeiras posições de bit M é compreensivelmente LSB → MSB, então o bit 0 estaria emb[0]
.
No entanto, sob mudança, a definição segue
O valor deE1
<<E2
éE1
deslocado para a esquerdaE2
posições de bit; bits desocupados são preenchidos com zero.
Aqui é preciso interpretar os bits emE1
como indo de MSB → LSB e depois para a esquerdaE2
vezes. Se tivesse sido escrito a partir de LSB → MSB, apenas a mudança para a direitaE2
os tempos dariam o mesmo resultado.
Estou surpreso que, em qualquer outro lugar do C ++, o idioma pareça projetar a ordem de escrita natural (inglês; da esquerda para a direita) (ao executar operações bit a bit, como deslocamento, etc.). Por que ser diferente aqui?