C位运算符示例

给出以下功能:

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

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

最近我有一个问题,我想答案应该是0,但我不知道如何证明。

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

谢谢!


按位操作不会将数字的底层表示更改为基数2 - 无论如何,CPU上的所有数学运算均使用二进制操作完成。

这个函数做什么是取n,然后将它加到它自己的补码负表示中。 这基本上否定了输入。 你放入的任何东西都等于0。

让我用8位数字来解释,因为这样更易于直观显示。

10以二进制表示为00001010。

负数存储在二进制补码中(注意数字并加1)

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

11110101 + 1 = 11110110

所以如果我们拿n +〜n + 1:

00001010 + 11110110 = 0

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

请参阅二进制算术中的CARRY和OVERFLOW标志


n是一个int, n +〜n will always result in an一个int,它具有所有的位。

严格地说,将1加到这样一个int的行为将取决于平台上有符号数字的表示。 C标准支持signed int 3个表示:

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

  • 在我的补充机器上(我认为今天很少见),结果将是1,因为所有位设置为0或-0(负零)或未定义行为的int

  • 一个有符号幅度的机器(实际上还有哪些还在使用?),一个int设置的所有位都是一个负数,幅度最大(因此实际值取决于int的大小)。 在这种情况下,将1加1会导致负数(确切的值,也取决于用于表示int的位数)。

  • 请注意,上面忽略了某些实现有可能使用n + ~n来捕获各种可能的位配置。

    链接地址: http://www.djcxy.com/p/36379.html

    上一篇: C Bitwise Operators Example

    下一篇: Too many 'if' statements?