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

C++ 根据掩码直接转换位的方法,c++,c,bit-manipulation,bitwise-operators,bit,C++,C,Bit Manipulation,Bitwise Operators,Bit,假设我们有一个字节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 因此,结果将是: a=

假设我们有一个字节
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
因此,
结果将是:

a=old, b= new
result=a'b+ab
B=~B&M | B&M在C中似乎不起作用

我可能可以用条件句来做,但必须有一种不用条件句的方法

另一个例子: 如果我们关心第二位,并且如果
B=0001
M=0010
,那么操作的结果将是
0011
。但如果
M
M=0000
,则操作结果为
0001


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

它不能作为布尔函数实现,因为要使用的运算符是逐位的,因此操作数是多位的。但您可以合并一些位移位来适应:

#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//例如

B&=~(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//例如

B&=~(1您需要指定您关心的位的偏移量(例如,
索引
):

char AssignBit(无符号字符字节、无符号字符掩码、整数索引)
{

unsigned char cleared=byte&~(1您需要指定您关心的位的偏移量(例如
index
):

char AssignBit(无符号字符字节、无符号字符掩码、整数索引)
{

unsigned char cleared=byte&~(1如何将
n
th位更改为
x

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

number^=(-x^number)和(1如何将
n
th位更改为
x

number ^= (-x ^ number) & (1 << n);
number^=(-x^编号)和(1)
例如,如果B=1111,M=0000,那么我们希望在操作之后
B=1110

问题是您没有指定
M
中的哪个位是有效位,并且无法从
M
的值确定有效位


实际上,您需要三个量,字节
B
,值
V
(您称之为M)和掩码
M
(您的问题中缺少)

以下是结合了这三个方面的代码:

result = (B & ~M) | (V & M);
例如,如果B=1111,M=0000,那么我们希望在操作之后 B=1110

问题是您没有指定
M
中的哪个位是有效位,并且无法从
M
的值确定有效位


实际上,您需要三个量,字节
B
,值
V
(您称之为M)和掩码
M
(您的问题中缺少)

以下是结合了这三个方面的代码:

result = (B & ~M) | (V & M);

如果我理解正确,你想把B中的一位设置为M中该位的值,你不在乎B中的前一个值是什么。在这种情况下,M不是真正的掩码;你的掩码是由位号给出的。所以你可以这样做

unsigned mask = (1<<BITNUM);
unsigned result = (~mask & B) | (mask & M)

unsigned mask=(1如果我理解正确,你想把B中的一个位设置为M中该位的值,你不在乎B中的前一个值是什么。在这种情况下,M不是真正的掩码;你的掩码是由位号给出的。所以你可以这样做

unsigned mask = (1<<BITNUM);
unsigned result = (~mask & B) | (mask & M)


无符号掩码=(1我很困惑,根据您的真值表,
f
new
相同,我认为它们完全相同是巧合。@vu1p3n0x让我们称之为
result
而不是
f
。@kuhaku请给出更好的示例或简洁的算法。如果
input=1,我也会被示例搞糊涂111
mask=0000
操作后
output=1110
如何?在我的书中
input=1111
mask=0000
应该是
output=0000
,例如
input=1101
mask=0111
output=0101
。只需使用位运算符即可。我很困惑,根据您的真值表,
f
new
相同,我认为它们完全相同是巧合。@vu1p3n0x让我们称之为
result
而不是
f
@kuhaku请给出更好的示例或简洁的算法。如果
input=1111
mask=0000
操作后
output=1110
如何?在我的书中
input=1111
with
mask=0000
应该是
output=0000
,例如
input=1101
with
mask=0111
output=0101
。只需使用位运算符即可。代码可以调用undefi由于移位有符号整数和更改符号位而导致的ned行为。OP使用无符号类型——希望是有意的。@Olaf我假设
index
是8位字节的有效索引,即在
0..7
范围内。如果满足此条件,则不存在UB。
char
是一个字节,但不能保证它有8个bits.有非常好的16位字节架构。@Olaf很好,
索引必须在
0..CHAR\u bit-1
MAX\u INT
必须大于
CHAR\u bit
的范围内。我高度怀疑是否存在一个不能满足这一要求的平台。我已经告诉过你了。还有更多问题需要解决