c ++

时间:2019-12-15 14:16:00

标签: c++ bitwise-operators

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

c= 0x3FFFFFFF

a = an arbitrary integer number=Q。我的问题是,为什么a &= c始终等于“ Q”并且它没有变化?例如,如果我考虑a=10,则a &= c的结果为10;如果a=256的结果为a &= c256。你能解释为什么吗?非常感谢。

4 个答案:

答案 0 :(得分:1)

a和c都是整数类型,在计算机中由32位组成。计算机中整数的第一位是符号位。正数的第一位为0,负数的第一位为1。0x3FFFFFFF是一个特殊值。此数字的前两位数字为0,其他数字均为1。1&1 = 1,1&0 =0。因此,当数字aa为正且小于c时,a&0x3FFFFFFF本身仍然< / p>

答案 1 :(得分:1)

a &= ca = a & c相同,后者计算ab的二进制和,然后再次将该值分配给a-就在如果您误解了该运算符的功能。

现在a仅包含1。然后,想一想每一位变成了什么:1 & x将永远是x。由于您仅尝试使用如此低的数字,因此它们都不会改变。

尝试使用c=0xffffffff,您会得到不同的结果。

答案 2 :(得分:1)

您尚未对a &= c;的所有可能值a进行测试,并且断言它不会在所有情况下更改a的值都是错误的。

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

0x3FFFFFFF中,设置了30个最低有效位。在a &= c;中使用此数字并设置了较高位的任何数字(例如0xC0000000)时,较高位将被清除。

答案 3 :(得分:0)

如果您了解按位&"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
  

现在,如果一个数字中的所有位都是1会发生什么?

让我们看看。

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位均为1

现在,当a > 15表示a超过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相同。

  

我们假定您正在使用32位整数变量。

  • 您设置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 a &= c后的a的值与先前的a <= c相同) >