如何仅使用 C 中的按位运算符来检查值是否大于 7?

Tho*_*fur -1 c bit-manipulation bitwise-operators twos-complement

对于此问题,如果参数大于 7,则要求返回 1,否则返回 0。

例如,如果 x 为 8,则该函数将返回 1。如果 x 为 7,则该函数将返回 0。

唯一允许的合法运算符是 (! ~ & ^ | + << >>),它禁止使用其他任何运算符,例如 -、for 循环、while 循环、if 语句等。

我们可以假设系统使用 2 的补码和整数的 32 位表示,以算术方式执行右移,并且在将整数移位超过字大小时会出现不可预测的行为。

我知道不使用 - 操作的减法可以用 ~ 来完成,但说实话,我不知道如何从逻辑上思考这个问题。

Gov*_*mar 6

在二进制中,十进制数7111。因此,大于 7 的数字将始终具有比 7 的二进制表示中的最高有效位(即从 0 编号时的位 3)组更高的有效位组。因此,如果您只处理无符号数字,那么这个测试就足够了:

int bitwise_is_n_gt_7 (unsigned int value)
{
    return value & 0xFFFFFFF8; // assuming size 32-bits adjust as  necessary
} 
Run Code Online (Sandbox Code Playgroud)

如果您正在处理带符号的数字,您还必须处理数字为负数的可能性,因此您需要测试:

int bitwise_is_n_gt_7 (int value)
{
    return (!!(value & 0x7FFFFFF8) & !(value & 0x80000000));
}
Run Code Online (Sandbox Code Playgroud)