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&=c所有可能值均为a
的代码>,如果断言它不正确,则在所有情况下都不会更改a
的值
a&=c如果a
和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”。我有点希望,或者会继续下去