簡體   English   中英

右移 unsigned char 填充了一個?

[英]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_tuint16_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.

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