簡體   English   中英

為什么std :: bitset以little-endian方式公開位?

[英]Why does std::bitset expose bits in little-endian fashion?

當我使用std::bitset<N>::bitset( unsigned long long )這會構造一個位集,而當我通過operator[]訪問它時,這些位似乎是按照小端順序排列的。 例:

std::bitset<4> b(3ULL);
std::cout << b[0] << b[1] << b[2] << b[3];

打印1100而不是0011即結尾(或LSB)在小(低)地址索引0處。

查找標准,它說

將前M個位位置初始化為val的相應位值

程序員自然會想到從LSB到MSB(從右到左)的二進制數字。 因此, 前M個位的位置可以理解為LSB→MSB,因此位0將位於b[0]

但是,在轉移的情況下,定義

E1 << E2的值是E1左移E2位的位置; 空出的位為零。

在這里,必須將E1的位解釋為從MSB→LSB開始,然后左移E2次。 如果它是從LSB→MSB寫入的,則只有右移E2次才能得到相同的結果。

令我驚訝的是,在C ++的其他所有地方,該語言似乎都投射出自然的(英語;從左到右)書寫順序(進行移位之類的按位操作時)。 為什么在這里與眾不同?

就標准而言,沒有字節順序的概念。 關於std::bitset[template.bitset]/3定義位位置

bitset<N>類的對象和某個整數類型的值之間進行轉換時, 位位置 pos對應於位值1<<pos 對應於兩個或多個位的整數值是它們的位值之和。

在標准報價中使用此位位置定義

將前M 位位置初始化為val的相應位值

一個val用二進制表示11通向bitset<N> bb[0] = 1b[1] = 1 ,並設置為剩余位0

這與位通常被編號的方式是一致的-位0代表2 0 ,位1代表2 1 ,依此類推。這與體系結構的字節序無關,后者涉及字節順序而不是位順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM