假设我们有一个字节B
和一个掩码M
,这样掩码中的一个位是1或0而其他位是0,(假设我们知道哪个位是,它可以是任何位,但为简单起见它是LSB)。我们希望B
中的相同位与M
中的位具有相同的值。
例如,如果B=1111
,M=0000
我们希望在操作B=1110
之后,但如果M
是M=0001
那么B
本来是B=1111
。
我基本上是在询问如何实现从这个真值表生成的布尔函数:
old new result
0 0 0
0 1 1
1 0 0
1 1 1
所以result
将是:
a=old, b= new
result=a'b+ab
在C中执行B = ~B&M | B&M;
似乎不起作用......
我可能可以用条件语做到这一点,但如果没有它们,必须有一种方法。
另一个例子:
如果我们关心第二位,如果B=0001
,M=0010
,那么操作的结果将是0011
。但如果M
为M=0000
,则操作结果为0001
。
我知道如何设置清除和切换,这不是我要求的。
答案 0 :(得分:3)
您需要指定您关注的位的偏移量(例如index
):
char AssignBit(unsigned char byte, unsigned char mask, int index)
{
unsigned char cleared = byte & ~(1 << index);
unsigned char assigned = cleared | mask & (1 << index);
return assigned;
// or simply:
return byte & ~(1 << index) | mask & (1 << index);
// if it is guaranteed that at most one bit is set in mask, this also works:
return byte & ~(1 << index) | mask;
}
答案 1 :(得分:2)
如果我没有正确解读,你想要将B中的一个位设置为M中该位的值,而不关心B中的前一个值是什么。在这种情况下,M并不是真正的面具;你的面具是由位数给出的。所以你要做像
这样的事情unsigned mask = (1<<BITNUM);
unsigned result = (~mask & B) | (mask & M)
其中BITNUM = 0,如果它是LSB。
答案 2 :(得分:1)
它不能实现为布尔函数,因为要使用的运算符是按位的,因此操作数是多位的。但是你可以采用一些位移来适应这种情况:
#define BIT_NUMBER 3 // For example
B &= ~(1 << BIT_NUMBER); // Zero out the bit
B |= M << BIT_NUMBER; // Set to M's bit value
答案 3 :(得分:1)
例如,如果B = 1111,M = 0000,那么我们希望在操作之后 B = 1110
问题是你没有指定M
中的哪个位是重要的,并且无法从M
的值确定有效位。
您实际上需要三个数量,字节B
,值V
(您正在调用M)和掩码M
(您的问题中缺少)。
以下是结合三者的代码:
result = (B & ~M) | (V & M);
答案 4 :(得分:-1)