根据掩码转换位的直接方法

时间:2016-05-02 20:46:05

标签: c++ c bit-manipulation bitwise-operators bit

假设我们有一个字节B和一个掩码M,这样掩码中的一个位是1或0而其他位是0,(假设我们知道哪个位是,它可以是任何位,但为简单起见它是LSB)。我们希望B中的相同位与M中的位具有相同的值。

例如,如果B=1111M=0000我们希望在操作B=1110之后,但如果MM=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=0001M=0010,那么操作的结果将是0011。但如果MM=0000,则操作结果为0001

我知道如何设置清除和切换,这不是我要求的。

5 个答案:

答案 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)

如何将n位更改为x

number ^= (-x ^ number) & (1 << n);

(取自https://stackoverflow.com/a/47990/6149078