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
withmask=0000
应该是output=0000
,例如input=1101
withmask=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
的范围内。我高度怀疑是否存在一个不能满足这一要求的平台。我已经告诉过你了。还有更多问题需要解决