[英]right-shifting unsigned char is filling with ones?
在我的系統上, (unsigned char) -1
是(預計為 8 位的字符)二進制 1111 1111(十進制 255)。
類似地, (unsigned char) -1 >> 1
是預期的 0111 1111。左邊用零填充。
~((unsigned char) -1 >> 1)
是 1000 0000 正如預期的那樣。
現在我想生成 unsigned char 0010 0000 例如。
我試過~((unsigned char) -1 >> 1) >> 2
,但這輸出 1110 0000.... 什么? 為什么左邊突然被填滿了?
如何生成啟用第 n 位(從左側)的unsigned char
?
我想
n unsigned char
0 1000 0000
1 0100 0000
2 0010 0000
3 0001 0000
...
7 0000 0001
目前, ~((unsigned char) -1 >> 1) >> n
給了我
n unsigned char
0 1000 0000
1 1100 0000
2 1110 0000
3 1111 0000
...
7 1111 1111
uint8_t
和uint16_t
存在此問題,但在uint32_t
及更高版本不再發生。
由於 integer 促銷,當對值執行幾乎任何操作時, unsigned char
都會提升為int
。
當您向右移動時,左操作數會經歷 integer 提升,並且unsigned char
將變為int
。 表達式的值將是提升后左操作數的值 - 因此((unsigned char) -1 >> 1)
的結果值為 127,類型為int
。 如果你~
(int)127
你會得到一個帶符號位的int
; 轉移該權利將具有實現定義的行為。
解決方案是在外部~
周圍添加一個演員表:
(unsigned char)~((unsigned char) -1 >> 1) >> 2
或者, &
帶有0xFF
的值:
(~((unsigned char) -1 >> 1) >> 2) & 0xFF
至於設置unsigned char
左側的第n
位,最好的解決方案是 *left-shift 1U
到 position,如Allan Wind所示。
另一種設置第 n 位的方法(從左至右):
1 << (CHAR_BIT - n - 1)
您可以利用std::numeric_limits<T>::digits
來創建更少混淆和靈活的代碼:
unsigned char data=0;
const uint8_t sizeBit=std::numeric_limits<decltype(data)>::digits;
for(uint8_t n=0;n<sizeBit;n++) {
data = 1 << (sizeBit - (n+1));
std::bitset<sizeBit> x(data);
std::cout << x << '\n';
}
印刷:
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.