偶然发现了这段特殊代码,我在理解它时遇到了一些麻烦:
a = ((((z * y) + 31) & ~31) / 8) * abs(x);
a
,z
,y
和x
都属于int
类型。
我了解~
有翻转所有1
和0
的效果,在这种情况下,31
不会0
成为&
}}? {{1}}如何在这一行中发挥作用?它不是用于逻辑语句而不是像这样的方程吗?
答案 0 :(得分:3)
让我们使用一个简单的例子来逐步完成代码。我们为示例设置x = y = z = 10;
。您的单行可以分为几个部分:
temp1 = z * y;
temp2 = temp1 + 31;
temp3 = temp2 & ~31;
temp4 = temp3 / 8;
a = temp4 * abs(x);
此处,temp1
- temp4
也属于int
类型。使用上面的代码和示例值,temp1
和temp2
可以直接计算:
temp1 = 10 * 10 = 100
temp2 = 100 + 31 = 131
要获得temp3
,我们需要知道temp2
的二进制表示形式,在本例中为10000011
。因此,我们得到:
10000011
& 11100000
----------
10000000 = 128 in decimal
所以temp3 = 128
。从这里开始,temp4
和a
是微不足道的:
temp4 = 128 / 8 = 16
a = 16 * 10 = 160
为了将来参考,当您对一行代码的作用感到困惑时,首先将其拆分,就像我上面所做的那样,然后使用调试器(如gdb)来逐步执行代码。这将有助于使代码清晰。
答案 1 :(得分:1)
部分混淆源于您错误地评估了~31
的事实。
对于8位数的简单情况,31实际上是00011111
,因此~31
= 11100000
不是00000000
。要回答关于&
运算符的问题,它是一个按位AND运算符,就像~
是一个按位NOT运算符一样;因此,((z * y) + 31) & ~31
对(z * y) + 31
和~31