2017-02-13 125 views
1

我有一個字節,其在二進制值是11111111我必須根據這些規則我的字節擴展到16位0101010101010101:如果位= 1,現在是01.如果位= 0,現在是10我如何屏蔽位?

例如:

00001111 -> 1010101001010101 
00000101 -> 1010101010011001 

這樣做的操作是什麼?

+0

你爲什麼用16位掩碼屏蔽一個字節?你打算把你的字節實體轉換成16位字嗎? –

+0

你意識到一個字節(通常是現在的日子)只有8位。你如何計劃增加你的字節? –

回答

0

我不認爲有一個運營商的「擴大」位如上所述。 但是你可以在移和測試位如下一起做一個循環:

unsigned char b = 0xff; 
unsigned int result = 0x0; 

for (int i=0; i<8; i++) { 
    result <<= 2; // make place for the next 2 bits 

    int isSet = b & 0x80; // check highest significant bit of b 
    if (isSet) { 
     result |= 0x01; // in bits: 01 
    } 
    else { 
     result |= 0x02; // in bits: 10 
    } 

    b <<= 1; 
} 

希望它能幫助。

+0

就是這樣!謝謝 –

+0

不客氣。如果它解決了你的問題,請不要忘記接受答案...... –

1

首先,你的字節轉換爲int:

int x = (int)byte_value; 

然後,延伸到16位,通過在時移的位4,則如圖2所示,然後如圖1所示,然後用移和按位倍增每個比特OR:

x = ((x << 4) | x) & 0b0000111100001111; 
x = ((x << 2) | x) & 0b0011001100110011; 
x = ((x << 1) | x) & 0b0101010101010101; 
x = (x << 1) | x; 

然後,掩蔽的位,以使偶數位位置是1,如果該位爲1,而奇數位置爲1,如果該位爲0(使用逐比特NOT):

x = (x & 0b0101010101010101) | (~x & 0b1010101010101010); 
+0

要小心:如果byte_value被簽名爲char,那麼轉換爲int將執行符號擴展並可能填充除了低8位以外的所有符號。 –