【发布时间】:2011-11-13 19:38:01
【问题描述】:
我需要确定一个有符号的 32 位数字是否是 2 的幂。到目前为止,我知道要做的第一件事是检查它是否为负数,因为负数不能是 2 的幂。 然后我需要看看下一个数字是否有效等等......所以我可以这样写:
// Return 1 if x is a power of 2, and return 0 otherwise.
int func(int x)
{
return ((x != 0) && ((x & (~x + 1)) == x));
}
但对于我的任务,我只能使用其中的 20 个运算符:
! ~ & ^ | + << >>
并且没有相等语句或循环或转换或语言构造。
所以我正在尝试转换相等部分,我知道 !(a^b) 与 a == b 相同,但我似乎无法完全弄清楚。关于如何将其转换为允许的运营商的任何想法?
【问题讨论】:
-
看看是否有人可以找到一种方法来回答这个问题, 只是给你答案。
-
在这种情况下使用的一个非常有用的技巧是
!!x。这使数字标准化,因此 0 变为 0 而非 0 变为 1。它甚至更有效(编译器对其进行了优化)。 -
我总是遇到问题 !!x 所以如果 x = 2 然后 !x = 1 然后 !!x = 0。如果 x = 0, !x = 0 和 !!x = 1 个?
-
我可以打开一个新的 stackexchange 站点提案,用于“不称职的 CS 讲师 X 的 do-everything-with-
!~&^|+<<>>问题”吗?它已经到了我们有足够的整个网站的地步...... -
我认为如果讲师也理解 C,这些问题会很好,但是他/她所说的方式,它们在 C 中无法解决,并且所需的“解决方案”充满了未定义的行为(这可以通过切换到无符号算术来解决)。我也认为很不幸,班上的一名学生发现/知道 Stack Overflow,并告诉全班同学来这里为他们完成作业......
标签: c binary logic bit-manipulation