首页 > 解决方案 > 检查输入是否是最大的 2 的补码整数

问题描述

/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */
int isTmax (int x) 
{
    int t = x + 1;
    return !(t + t) ^ !t;
}  

如果x是最大的 2 的补数,则2*t溢出到 0,但如果x是 -1,它也为 0,所以我们对其进行异或运算,!t结果为 1。所以我们必须得到 1,但不知何故输出为 0。

标签: cbit-manipulationbitwise-operators

解决方案


这段代码根本上是错误的。有符号溢出是未定义的行为,不能保证给出任何形式的确定性结果。

要检查一个数字是否是“最大可能的”,您宁愿将其与INT_MAXlimits.h 中的数字进行比较。或者,如果您愿意,请将其与(int) ((1u<<31)-1).


推荐阅读