我有一个问题,如果您能帮助我理解它,我将不胜感激。想象一下,我定义以下数字
c= 0x3FFFFFFF
和a = an arbitrary integer number=Q
。我的问题是,为什么a &= c
始终等于“ Q”并且它没有变化?例如,如果我考虑a=10
,则a &= c
的结果为10
;如果a=256
的结果为a &= c
是256
。你能解释为什么吗?非常感谢。
答案 0 :(得分:1)
a和c都是整数类型,在计算机中由32位组成。计算机中整数的第一位是符号位。正数的第一位为0,负数的第一位为1。0x3FFFFFFF是一个特殊值。此数字的前两位数字为0,其他数字均为1。1&1 = 1,1&0 =0。因此,当数字aa为正且小于c时,a&0x3FFFFFFF本身仍然< / p>
答案 1 :(得分:1)
a &= c
与a = a & c
相同,后者计算a
和b
的二进制和,然后再次将该值分配给a
-就在如果您误解了该运算符的功能。
现在a
仅包含1。然后,想一想每一位变成了什么:1 & x
将永远是x
。由于您仅尝试使用如此低的数字,因此它们都不会改变。
尝试使用c=0xffffffff
,您会得到不同的结果。
答案 2 :(得分:1)
您尚未对a &= c;
的所有可能值a
进行测试,并且断言它不会在所有情况下更改a
的值都是错误的。
a &= c;
将a
设置为一个值,如果同时设置了a
和c
中相同位置的两位,则将每个位置1。如果两个位都没有置位,则结果中的5he位将被清除。
在0x3FFFFFFF
中,设置了30个最低有效位。在a &= c;
中使用此数字并设置了较高位的任何数字(例如0xC0000000
)时,较高位将被清除。
答案 3 :(得分:0)
如果您了解按位&
("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
现在,如果一个数字中的所有位都是
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 &= 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
的值与先前的a <= c
相同) >