C位运算符示例

时间:2016-05-09 00:57:51

标签: c bit-manipulation bitwise-operators

给出以下功能:

int boof(int n) {
    return n + ~n + 1;
}

此功能返回什么?我无法准确理解传递给它的内容。如果我调用boof(10),它会将10转换为base 2,然后对二进制数进行按位运算吗?

这是我最近在测验中遇到的一个问题,我认为答案应该是0,但我不确定如何证明它。

注意:我知道每个按位运算符的工作原理,我对输入的处理方式更加困惑。

谢谢!

2 个答案:

答案 0 :(得分:2)

按位运算不会将数字的基础表示更改为基数2 - CPU上的所有数学都是使用二进制运算完成的。

这个函数做的是取n然后将它添加到自身的二进制补码表示中。这基本上否定了输入。你输入的任何东西都等于0。

让我用8位数字来解释,因为这更容易想象。

10以二进制表示为00001010。

负数存储在两个补码中(注意数字并加1)

所以10的(~n + 1)部分看起来像这样:

  

11110101 + 1 = 11110110

所以如果我们采取n + ~n + 1:

  

00001010 + 11110110 = 0

注意如果我们将这些数字加在一起,我们得到一个左进位,它将设置溢出标志,结果为0.(将负数和正数加在一起绝不意味着溢出表示异常!)

看到这个 The CARRY and OVERFLOW flag in Binary Arithmetic

答案 1 :(得分:2)

nint时,n + ~n将始终生成一个int,其中包含所有位。

严格地说,向这样的int添加1的行为将取决于平台上已签名号码的表示。 C标准支持signed int的3个表示:

  • 对于Two's Complement机器(今天使用的绝大多数系统),结果将为0,因为设置了所有位的int为-1。

  • 在One's Complement机器上(我相信今天非常罕见),结果将为1,因为int所有位设置为0或-0(负零)或未定义的行为

  • 一个有符号幅度的机器(其中是否还有其中任何一个仍在使用?),设置了所有位的int是一个具有最大幅度的负数(因此实际值将取决于int)的大小。在这种情况下,向它添加1将导致负数(确切的值,再次取决于用于表示int的位数)。

请注意,上面忽略了某些实现可能会使用n + ~n可能的各种位配置进行陷阱。