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 &= c
和a = a & c
一样,计算a
和b
的二进制与,然后再把那个值赋值给a
——以防万一您弄错了该运算符的作用。
现在 a
几乎只包含 1。然后想想每一位变成什么:1 & x
将永远是 x
。由于您只尝试使用如此低的数字,因此其中 none 会发生变化。
试试 c=0xffffffff
你会得到不同的结果。
您没有用 a
的所有可能值测试 a &= c;
,断言它在所有情况下都不会改变 a
的值是不正确的。
a &= c;
将 a
设置为一个值,如果 a
和 c
中相同位置的两个位都被设置,则每个位都被设置。如果两个位都没有设置,则结果中的第 5he 位被清除。
在0x3FFFFFFF
中设置了30个最低有效位。当它在 a &= c;
中与任何设置了高位的数字一起使用时,例如 0xC0000000
,高位将被清除。
如果你了解按位&
("and"
) 操作及其工作原理,那么这应该没有问题。比如说,你有两个数字 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
Now, what would happen, if all of the bits in one number are 1
s?
让我们看看。
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
s.
现在会发生另一个问题,当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 &= c
与 a = a & c
相同。
We assumed that you are using 32-bit integer variables.
你设置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 &= c
后a
的值与之前的a
相同)仅当a <= 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 &= c
和a = a & c
一样,计算a
和b
的二进制与,然后再把那个值赋值给a
——以防万一您弄错了该运算符的作用。
现在 a
几乎只包含 1。然后想想每一位变成什么:1 & x
将永远是 x
。由于您只尝试使用如此低的数字,因此其中 none 会发生变化。
试试 c=0xffffffff
你会得到不同的结果。
您没有用 a
的所有可能值测试 a &= c;
,断言它在所有情况下都不会改变 a
的值是不正确的。
a &= c;
将 a
设置为一个值,如果 a
和 c
中相同位置的两个位都被设置,则每个位都被设置。如果两个位都没有设置,则结果中的第 5he 位被清除。
在0x3FFFFFFF
中设置了30个最低有效位。当它在 a &= c;
中与任何设置了高位的数字一起使用时,例如 0xC0000000
,高位将被清除。
如果你了解按位&
("and"
) 操作及其工作原理,那么这应该没有问题。比如说,你有两个数字 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
Now, what would happen, if all of the bits in one number are
1
s?
让我们看看。
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
s.
现在会发生另一个问题,当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 &= c
与 a = a & c
相同。
We assumed that you are using 32-bit integer variables.
你设置
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 &= c
后a
的值与之前的a
相同)仅当a <= c