This question already has answers here: How do you set, clear, and toggle a single bit? (26个答案) 6年前关闭。 我们有一个整数int x = 50;用二进制,它是00110010如何以编程方式更改第四(第四)位? 最佳答案 您可以通过将数字的第四位与除第四位之外的所有地方的零进行或运算来设置数字的第四位。可以这样做x |= (1u << 3);同样,您可以通过对第四位进行“与”运算来清除第四位,但第四位除外。例如:x &= ~(1u << 3);最后,您可以通过对第四位进行异或运算来切换第四位,该值在第四位以外的所有地方均为零:x ^= (1u << 3);要了解其工作原理,我们需要看两件事:在这种情况下,<<运算符的行为是什么? 这里的AND,OR和XOR运算符的行为是什么? 在以上所有三个代码段中,我们使用<<运算符生成一个值。 <<运算符是按位左移运算符,该运算符获取一个值,然后将其所有位向左移动若干步。在你的情况下,我用1u << 3取值1(具有二进制表示1),然后将其所有位移至三个点,用0填充缺失值。这将创建二进制值1000,该位的第四位已设置。现在,为什么x |= (1u << 3);设置数字的第四位?这与OR运算符的工作方式有关。 |=运算符类似于+=或*=,但按位OR除外-它等效于x = x | (1u << 3);那么,为什么将x与二进制值1000进行或运算来设置其第四位呢?这与定义OR的方式有关:0 | 0 == 00 | 1 == 11 | 0 == 11 | 1 == 1不过,更重要的是,我们可以将其更紧凑地重写为x | 0 == xx | 1 == 1这是一个非常重要的事实,因为这意味着将任何一位与零进行“或”操作不会更改该位的值,而将任何一位与1进行“或”操作始终会将其设置为1。这意味着当我们写x |= (1u << 3);因为(1u 现在,让我们看一下x &= ~(1u << 3);这使用按位补码运算符~,它接受一个数字并翻转其所有位。如果我们假设整数是两个字节(为简单起见),这意味着(1u << 3)的实际编码为0000000000001000当我们补充这一点,我们得到的数字1111111111110111现在,让我们看看将两个值按位与在一起时会发生什么。 AND运算符具有以下有趣的真值表:0 & 0 == 00 & 1 == 01 & 0 == 01 & 1 == 1或者,更紧凑地说:x & 0 == 0x & 1 == x请注意,这意味着如果我们将两个数字与在一起,结果值将是将所有与零进行AND-ed的位设置为零,而保留所有其他位。这意味着如果我们与~(1u << 3)我们与1111111111110111因此,在我们的上表中,这意味着“按原样保留除第四位以外的所有位,然后将第四位更改为零”。更一般而言,如果您要清除一组位,则创建一个数字,该数字在您希望保持位不变的所有位置都为1,而在要清除这些位的位置为0。最后,让我们看看为什么x ^= (1u << 3)翻转数字的第四位。这是因为二进制XOR运算符具有以下真值表:0 ^ 0 == 00 ^ 1 == 11 ^ 0 == 11 ^ 1 == 0注意x ^ 0 == 0x ^ 1 == ~x其中~x与x相反;它的1表示0,0表示1。这意味着,如果我们将x与(1u << 3)值进行XOR运算,我们将对其进行XOR运算0000000000001000因此,这意味着“保持第四位不变的所有位,但翻转第四位”。更一般而言,如果要翻转一定数量的位,请将该值与一个数字进行异或运算,该数字在要保留位完整的位置为零,而要翻转该位的位置为1。希望这可以帮助!关于c++ - 更改一位整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6916974/
10-09 13:30