如果這看起來像一個愚蠢的問題,我很抱歉我只是無法理解位和按位運算分配
我有兩個整數,一個是掩碼,另一個是任意整數,我應該將整數與掩碼的 16 個最高有效位進行異或運算,但我不確定重要的是前 16 位還是后 16 位,如果我的操作甚至是正確的,因為我不知道如何驗證它我試過這個
int main(){
uint32_t mask = 3405705229;
uint16_t arbitrary = 0xABCD;
arbitrary^=mask&16;
printf("%X\n",arbitrary);
}
我以為 mask&16 只會給我掩碼的前 16 位但是當我列印時我仍然得到 ABCD 所以這是不對的。我也嘗試過arbitrary^=(mask>>16)&16;,但這也沒有做任何事情
uj5u.com熱心網友回復:
對于無符號 8 位值,您可能有:
Bit number: 7 6 5 4 3 2 1 0
Bit value: 1 0 0 0 1 1 0 1 = 141 = 0x8D
4 個最高有效位 (MSB) 是位 7-4;4 個最低有效位 (LSB) 是位 3-0。
您將從uint8_t x8 = 141;使用中提取 4 個最重要的位:
uint8_t y = (x >> 4) & 0xF
輸出將y等于 8 或0x08.
當然,您可以擴展它以容納更多位數。
請注意,MSB 和 LSB 通常用于 {Most|Least} 有效位元組而不是位- 但這仍然以類似的方式適用于 8 位位元組塊中的邏輯值。正如paulsm4在評論中 指出的那樣,這適用于邏輯值。CPU 有兩種主要風格:大端(SPARC、舊 PowerPC、摩托羅拉……)和小端(英特爾和許多其他芯片,至少包括現代 PowerPC 作為一種選擇)。不同之處在于存盤多位元組(整數)值的位元組的順序:
對于值為 0x12345678 的 4 位元組無符號整數,這兩種型別以相反的順序存盤資料:
地址 0x1000 0x1001 0x1002 0x1003 大端 0x12 0x34 0x56 0x78 小端 0x78 0x56 0x34 0x12
大端 MSB ... ... LSB 小端 LSB ... ... MSB
如今,little-endian 更為普遍。但是,許多網路協議和其他系統都要求使用大端。大多數時候,您不必擔心它。有時,你會這樣做——重要的是要知道你什么時候這樣做,什么時候不這樣做。單臺機器上的資料,沒有在其他地方共享,通常不需要你擔心位元組順序。您不必擔心(單位元組)字串中資料的位元組順序。
uj5u.com熱心網友回復:
在二進制數中,最左邊的位稱為最高有效位 (msb),最右邊的位稱為最低有效位 (lsb)。如果有人說要用 16 個最高有效位進行掩碼,那么您應該嘗試從左到右獲取 16 位。
您可以在左移運算子的幫助下獲得最重要的 16 位。
左移運算子將數字向左移動并用零填充最高有效位(您不應將左移運算子與負數一起使用)。
所以下面的行將完成這項作業。
arbitrary^=(mask>>16);
uj5u.com熱心網友回復:
最高有效位是最高位(從左至右)。由于掩碼是 32 位,因此您只需將左 16 位移動以覆寫右 16 位。左邊的空間將用零填充。然后您可以將此掩碼與您的 16 位數字一起使用。
int main(){
uint32_t mask = 3405705229;
uint16_t arbitrary = 0xABCD;
arbitrary^ = (mask>>16);
printf("%X\n",arbitrary);
}
輸出:6133
順便說一句,掩碼值是個笑話,對吧?在十六進制中,它的值是 CAFEF00D。(您還應該嘗試 uint16_t 任意 = 0x1453;)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412630.html
標籤:
上一篇:特定模板(非型別)的模板函式特化
下一篇:多次使用標題是否不好?
