可能重复:
使用 C 中的位运算符检查数字是否非零。
大家好,
我正在做一个项目,我需要一些关于功能的帮助。我们需要编写一个函数来执行逻辑非,!,仅使用以下位运算符:
~ & ^ | + << >>
我什至不知道从哪里开始。
可能重复:
使用 C 中的位运算符检查数字是否非零。
大家好,
我正在做一个项目,我需要一些关于功能的帮助。我们需要编写一个函数来执行逻辑非,!,仅使用以下位运算符:
~ & ^ | + << >>
我什至不知道从哪里开始。
如果值不为零,则逻辑非返回 0,否则返回 1。假设 32 位整数:
int not_func(int v) {
/* compress value to single bit */
int p = (v >> 16) | v;
p = (p >> 8) | p;
p = (p >> 4) | p;
p = (p >> 2) | p;
p = (p >> 1) | p;
p ^= 1;
return (p & 1);
}
如果您可以假设true = 1
and false = 0
,那么这可能会奏效:
bool
not(bool x) {
bool not_x = x ^ true;
return not_x;
}
我想开始你想要你会想要澄清这个问题。听起来您想要一个函数,如果单词中的任何位都是“1”,则返回 0,如果所有位都为零,则返回 0 以外的值。假设一个 32 位的单词“a”,你可以这样做:
na1 = ~a;
shifted_na1 = na1 >> 1;
na2 = shifted_na1 & na1; /* any sequence of zeros is now 2 bits long */
shifted_na2 = na2 >> 2;
na3 = shifted_na2 & na2; /* any sequence of zeros is now 4 bits long */
shifted_na3 = na3 >> 4;
na4 = shifted_na3 & na3; /* any sequence of zeros is now 8 bits long */
shifted_na4 = na4 >> 8;
na5 = shifted_na4 & na4; /* any sequence of zeros is now 16 bits long */
shifted_na5 = na5 >> 16;
final = shifted_na5 & na5; /* any sequence of zeros is now 32 bits long */
really_final = final & 1;