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

C++ “的酉数&”;c+中的位运算符+;,c++,bitwise-operators,C++,Bitwise Operators,我有个问题,如果你能帮助我理解,我将不胜感激。想象一下我定义了以下数字 c= 0x3FFFFFFF 和a=任意整数=Q。我的问题是,为什么a&=c总是等于“Q”,并且它不会改变?例如,如果我考虑 a=10 < /代码>,则 A&=C < /代码>的结果是 10 < /代码>如果 a=256 < /代码> A&C= > 256 < /代码>。你能解释一下原因吗?非常感谢。a和c都是整数类型,在计算机中由32位组成。计算机中整数的第一位是符号位。正数的第一位是0,负数的第一位是1。0x3FF

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

c= 0x3FFFFFFF

a=任意整数=Q
。我的问题是,为什么
a&=c
总是等于“Q”,并且它不会改变?例如,如果我考虑<代码> a=10 < /代码>,则<代码> A&=C < /代码>的结果是<代码> 10 < /代码>如果<代码> a=256 < /代码> <代码> A&C= <代码> > <代码> 256 < /代码>。你能解释一下原因吗?非常感谢。

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

a&=c
a=a&c
相同,后者计算
a
b
的二进制和,然后再次将该值分配给
a
,以防万一您弄错了该运算符的操作

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


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

您尚未测试
a&=ca
的代码>,如果断言它不正确,则在所有情况下都不会更改
a
的值

a&=ca
c
中位于相同位置的两位都已设置,则code>将
a
设置为一个值,其中每个位都已设置。如果两位未同时设置,则结果中的位为5清除


0x3FFFFFFF
中,设置30个最低有效位。在
a&=c
对于设置了高位的任何数字,例如
0xC0000000
,高位将被清除。

如果您知道按位
&
“和”
)操作及其工作原理,那么这应该是毫无疑问的。比如说,你有两个数字
a
b
。它们每个都是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=5
b=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
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
s,会发生什么

让我看看

0 & 1 = 0
1 & 1 = 1
因此,如果任何一位是固定的,并且它为1,那么结果与另一位相同

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

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
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
s,则
&
结果与另一个数字相同。实际上,对于
a=4位长的数字的任何值,您将得到
a
,因为
b
是4位长,所有4位都是
1
s

现在会发生另一个问题,当
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&=c
a=a&c
相同

我们假设您使用的是32位整数变量

  • 设置
    c=0x3FFFFFFF
    意味着
    c=(2^30)-1
    c=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/<代码>相同,只有当>打开C++书,阅读解释二进制操作和按位运算的章节时才是真的。这就是位操作的工作原理,在C++的书中会有完整的解释,对于StActOffFult.com来说,这是一个简短的答案,它并不是真正的替代C++书籍。“我的问题是,为什么A& = C总是等于“Q”,它不会改变吗?”答案是,如果您在
a
a=0x40000000
中输入适当的值,它会发生变化,现在它停止工作,但它确实有很多值work@Slava支持莫妮卡,不。我输入的所有数字都得到了相同的结果。所以我想知道0x3FFFFF,对于这个和按位运算符,是否有点像酉。@aminbk“对于我输入的所有数字,我得到了相同的结果”,正如哈罗德已经告诉过你的,这个方程不适用于
a=0x40000000
(也称为
1073741824
)和更大的数字。你需要解释第一位是0。我想你指的是使有符号整数为负数的数字之后的第一个数字,但这确实需要更多的解释。很抱歉,我弄错了位数,这个数字的前两位是0,所以当数字a不大于c且a是正数时,a&c==a@EricPostpischil我同意。我并不是说它完全正确——尽管我承认我的评论可以这样理解。你总是让我“同意”你的“这是错误的”。现在他们也发现了这个细节。见“和小于c”。我有点希望,或者会继续下去