c++中“&”按位运算符的酉数

Unitary number for “&” bitwise operator in c++

我有一个问题,如果你能帮助我理解它,我将不胜感激。想象一下,我定义了以下数字

c= 0x3FFFFFFF

a = an arbitrary integer number=Q。我的问题是,为什么 a &= c 总是等于 "Q" 并且它不会改变?例如,如果我考虑 a=10 那么 a &= c 的结果是 10 如果 a=256 a &= c 的结果是 256。你能解释一下为什么吗?非常感谢。

a和c都是整数类型,在计算机中由32位组成。计算机中整数的第一位是符号 bit.The 正数的第一位是0,负数的第一位是1。0x3FFFFFFF是一个特殊的值。这个数的前两位是0,其他数位都是1。 1 & 1 = 1, 1 & 0 = 0。所以当a为正且小于c时,a & 0x3FFFFFFF还是a本身

a &= ca = a & c一样,计算ab的二进制与,然后再把那个值赋值给a——以防万一您弄错了该运算符的作用。

现在 a 几乎只包含 1。然后想想每一位变成什么:1 & x 将永远是 x。由于您只尝试使用如此低的数字,因此其中 none 会发生变化。

试试 c=0xffffffff 你会得到不同的结果。

您没有用 a 的所有可能值测试 a &= c;,断言它在所有情况下都不会改变 a 的值是不正确的。

a &= c;a 设置为一个值,如果 ac 中相同位置的两个位都被设置,则每个位都被设置。如果两个位都没有设置,则结果中的第 5he 位被清除。

0x3FFFFFFF中设置了30个最低有效位。当它在 a &= c; 中与任何设置了高位的数字一起使用时,例如 0xC0000000,高位将被清除。

如果你了解按位& ("and") 操作及其工作原理,那么这应该没有问题。比如说,你有两个数字 ab。它们中的每一个都是 n 位长。看,

a => a_(n-1) a_(n-2) a_(n-3) ... a_i ... a_2 a_1 a_0
b => b_(n-1) b_(n-2) b_(n-3) ... b_i ... b_2 b_1 b_0

其中a_0和b_0是最低位,a_(n-1)和b_(n-1)分别是a和b的最高位。

现在,看一下对两个单个二进制位的 & 运算。

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

所以&操作的结果只有当所有位都为1时才为1,如果至少有一位为0,则结果为0。

现在,对于n位长的数,

a & b = (a_i & b_i); where `i` is from 0 to `n-1`

例如a和b都是4位长的数,并且a = 5b = 12,那么

a = 5 => a = 0101
b = 12 => b = 1100

if c = (a & b), c_i = (a_i & b_i) for i=0..3, here all numbers are 4 bits(0..3)
now, c = c_3 c_2 c_1 c_0
so c_3 = a_3 & b_3
   c_2 = a_2 & b_2
   c_1 = a_1 & b_1
   c_0 = a_0 & b_0

a    0 1 0 1
b    1 1 0 0
-------------
c    0 1 0 0 (that means c = 4)

therefore, c = a & b = 5 & 12 = 4

Now, what would happen, if all of the bits in one number are 1s?

让我们看看。

0 & 1 = 0
1 & 1 = 1

因此,如果任何一位固定且为1,则结果与另一位相同。

如果 a = 5 (0101)b = 15 (1111),则

a    0 1 0 1 (5)
b    1 1 1 1 (15)
------------------
c    0 1 0 1 (5, which is equal to a=5)

因此,如果任何数字的所有位都是 1,则 & 结果与另一个数字相同。实际上,对于 a=any value of 4-bits long number,你会得到 a 的结果,因为 b 是 4 位长,所有 4 位都是 1s.

现在会发生另一个问题,当a > 15表示超过4位时

对于上面的例子,将位大小扩展为1,并将a的值改为25。 a = 25 (11001)b = 15 (01111)。尽管如此,b 除了大小之外与以前相同。所以最高有效位 (MSB) 为 0。现在,

a    1 1 0 0 1 (25)
b    0 1 1 1 1 (15)
----------------------
c    0 1 0 0 1 (9, not equal to a=25)

所以,很明显,如果我们想得到另一个数字作为 & 操作的结果,我们必须将每一位都保持为 1。

现在是分析您发布的场景的时候了。 这里,a &= ca = a & c 相同。

We assumed that you are using 32-bit integer variables.

  • 你设置c = 0x3FFFFFFF表示c = (2^30) - 1c = 1073741823

      a = 0000 0000 0000 0000 0000 0000 0000 1010 (10)
    & c = 0011 1111 1111 1111 1111 1111 1111 1111 (1073741823)
    ----------------------------------------------------------------
    a = 0000 0000 0000 0000 0000 0000 0000 1010 (10, which is equal to a=10)
    
    and
    
      a = 0000 0000 0000 0000 0000 0001 0000 0000 (256)
    & c = 0011 1111 1111 1111 1111 1111 1111 1111 (1073741823)
    ----------------------------------------------------------------
    a = 0000 0000 0000 0000 0000 0001 0000 0000 (256, which is equal to a=256)
    
    but, if a > c, say a=0x40000000 (1073741824, c+1 in base 10), then
    
      a = 0100 0000 0000 0000 0000 0001 0000 0000 (1073741824)
    & c = 0011 1111 1111 1111 1111 1111 1111 1111 (1073741823)
    ----------------------------------------------------------------
    a = 0000 0000 0000 0000 0000 0000 0000 0000 (0, which is not equal to a=1073741823)
    

所以,你的假设(执行语句a &= ca的值与之前的a相同)仅当a <= c