2017-02-13 127 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位以外的所有符号。 –