在C中设置最低有效位

时间:2013-11-02 16:51:19

标签: c bit steganography significant-digits

我在C中用bmp图像编写了一个简单的隐写术工具。

我将图像读取到内存中,并将文本隐藏在char字节[8]中,一次一个字符。

所以,例如。

a=0d97
bytes[0] = 0
bytes[1] = 1
bytes[2] = 1
bytes[3] = 0
bytes[4] = 0
bytes[5] = 0
bytes[6] = 0
bytes[7] = 1

然后我将转到第一个图像字节(每次char *ptr points)将字节[0]放到LSB,然后是下一个等等。

如果*ptr=0xff or 0b11111111我必须将最后一个1设置为0.可以使用

*ptr = *ptr ^ 0x01 ;

但是如果*ptr = 0x000b00000000 xor doesent工作,因为0^1=1

我很困惑如何设置案例。我需要一个运算符在每次0时最后一位,而在LSB为1或0的情况下不要触及其他位。

4 个答案:

答案 0 :(得分:8)

使用此模式将最低有效位设置为位(0或1)中的值:

new_value = old_value & 0xFE | bit

AND将关闭位0,如果位为1,则OR将重新打开。

答案 1 :(得分:7)

1和x的AND是x,而0和x的AND是0.因此,除了最低有效位之外,将它与所有位设置为1的数字相加:

*ptr = *ptr & 0xfe;

要将该位设置为1,请注意0和x的OR是x,而1和x的OR是1:

*ptr = *ptr | 0x01;

答案 2 :(得分:1)

您可以使用|运算符来设置该位。查看相关帖子以查看更多详细信息:How do you set, clear, and toggle a single bit?

答案 3 :(得分:0)

最简单的答案是。 如果你想在一个数字中将lsb设置为零。 如果数字是奇数, NUM = NUM​​-1。 如果是偶数,它在lsb已经为零。