C++ 更改一位整数
我们有一个整数C++ 更改一位整数,c++,c,bit-manipulation,bitwise-operators,C++,C,Bit Manipulation,Bitwise Operators,我们有一个整数 int x = 50; 在二进制中,它是 00110010 如何以编程方式更改第四(4)位?使用00001000(二进制)设置第四位、或 要清除第四位,和使用11110111(二进制) 要切换第四位,XOR与00001000(二进制) 示例: 00110010或000011000=00111010 00110010和11110111=00110010 00110010 XOR 000011000=00111010 您可以设置数字的第四位,方法是使用除第四位以外的任何地方都为零
int x = 50;
在二进制中,它是
00110010
如何以编程方式更改第四(4)位?使用
00001000
(二进制)设置第四位、或
要清除第四位,和
使用11110111
(二进制)
要切换第四位,XOR
与00001000
(二进制)
示例:
00110010或000011000=00111010
00110010和11110111=00110010
00110010 XOR 000011000=00111010
您可以设置数字的第四位,方法是使用除第四位以外的任何地方都为零的值对其进行运算或对其进行运算。这可以按如下方式进行
x |= (1u << 3);
设置数字的第四位?这与OR运算符的工作方式有关。|=
运算符类似于+=
或*=
,除了按位或-它等效于
x = x | (1u << 3);
不过,更重要的是,我们可以将其改写得更简洁
x | 0 == x
x | 1 == 1
这是一个极其重要的事实,因为这意味着用0或ing任何位都不会改变位的值,而用1或ing任何位总是将该位设置为1。这意味着当我们写作时
x |= (1u << 3);
当我们取这个的补码时,我们得到了这个数
1111111111110111
现在,让我们看看当我们将按位和两个值放在一起时会发生什么。AND运算符有一个有趣的真值表:
0 & 0 == 0
0 & 1 == 0
1 & 0 == 0
1 & 1 == 1
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
或者,更简洁地说:
x & 0 == 0
x & 1 == x
请注意,这意味着,如果我们将两个数字加在一起,结果值将使所有位和带零的ed设置为零,而保留所有其他位。这意味着如果我们
~(1u << 3)
因此,根据上表,这意味着“保留除第四位以外的所有位,保持不变,然后将第四位更改为零。”
更一般地说,如果要清除一组位,请在要保持位不变的任何位置创建一个数字,在要清除位的位置创建一个数字,该数字为零
最后,让我们看看原因
x ^= (1u << 3)
注意
x ^ 0 == 0
x ^ 1 == ~x
其中,
~x
与x相反;0代表1,1代表0。这意味着,如果我们用值(1u对x进行异或运算,则始终可以使用std::bitset
,这使得修改位变得容易
或者您可以使用位操作(假设您的意思是第4位计数为1。如果您的意思是从0开始计数,请不要减去1)。请注意,我使用1U
只是为了确保整个操作在无符号数字上进行:
要设置:x |=(1U可以使用二进制和或切换第四位
要设置x上的第四位,您可以使用x |=1在C语言中尝试这些函数之一来更改n位
char bitfield;
// start at 0th position
void chang_n_bit(int n, int value)
{
bitfield = (bitfield | (1 << n)) & (~( (1 << n) ^ (value << n) ));
}
void chang_n_bit(int n, int value)
{
bitfield = (bitfield | (1 << n)) & ((value << n) | ((~0) ^ (1 << n)));
}
void chang_n_bit(int n, int value)
{
if(value)
bitfield |= 1 << n;
else
bitfield &= ~0 ^ (1 << n);
}
char print_n_bit(int n)
{
return (bitfield & (1 << n)) ? 1 : 0;
}
char位域;
//从第0位开始
无效更改位(int n,int值)
{
bitfield=(bitfield |(1简单,因为您有,或者无论您有什么值
int x = 50;
要以编程方式设置第四位(从右开始)
int y = x | 0x00000008;
因为,0x
在数字前面加前缀意味着它是十六进制形式。
因此,0x0=0000
以二进制形式,而0x8=1000
以二进制形式。
这就解释了答案。1@Dustin Howett-谢谢你指出了这一点!修复了。我解释了答案中的位移位,它一直在那里丢失。1我通常会对在有符号类型上使用位运算感到不舒服。如果你想绝对可靠,请只使用无符号类型。(无符号整数类型有一个明确的位表示形式。)这是我到目前为止读过的最好的答案……现在非常清楚了!它是如何工作的?x |=(1U这个答案需要解释。@OmarAlshaker,在我的ans中解释过
~(1u << 3)
1111111111110111
x ^= (1u << 3)
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
x ^ 0 == 0
x ^ 1 == ~x
0000000000001000
char bitfield;
// start at 0th position
void chang_n_bit(int n, int value)
{
bitfield = (bitfield | (1 << n)) & (~( (1 << n) ^ (value << n) ));
}
void chang_n_bit(int n, int value)
{
bitfield = (bitfield | (1 << n)) & ((value << n) | ((~0) ^ (1 << n)));
}
void chang_n_bit(int n, int value)
{
if(value)
bitfield |= 1 << n;
else
bitfield &= ~0 ^ (1 << n);
}
char print_n_bit(int n)
{
return (bitfield & (1 << n)) ? 1 : 0;
}
int x = 50;
int y = x | 0x00000008;