不确定这行代码在C中意味着什么

时间:2014-09-25 15:21:53

标签: c

偶然发现了这段特殊代码,我在理解它时遇到了一些麻烦:

a = ((((z * y) + 31) & ~31) / 8) * abs(x);

azyx都属于int类型。

我了解~有翻转所有10的效果,在这种情况下,31不会0成为& }}? {{1}}如何在这一行中发挥作用?它不是用于逻辑语句而不是像这样的方程吗?

2 个答案:

答案 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类型。使用上面的代码和示例值,temp1temp2可以直接计算:

temp1 = 10 * 10 = 100
temp2 = 100 + 31 = 131

要获得temp3,我们需要知道temp2的二进制表示形式,在本例中为10000011。因此,我们得到:

  10000011
& 11100000
----------
  10000000 = 128 in decimal

所以temp3 = 128。从这里开始,temp4a是微不足道的:

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

的结果执行按位AND运算