作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图找到一种算法......
我可能假设我的机器适用于:
我也只能使用以下运算符:! ~ & ^ | + << >>
这是我到目前为止得到的:
int isPower2(int x) {
return ( !(x ^ (x & ~x+1)) )); // But this returns 1 if x == 0.
}
为了使此代码正常工作,我将其更改为 ((x ^ 0) && ( !(x ^ (x & ~x+1)
。但我不被允许使用&&
。所以我必须建立一个AND
共 NANDs
使用~
和&
运算符。
但我知道,我可以用NANDs
构建每一个可能的GATE (我只需要 ~
和 &
)。
所以... X AND Y
等于(X NAND Y) NAND (X NAND Y)
-NAND logic
X := (x ^ 0)
Y := !(x ^ (x & ~x+1))
但是正在改变((x ^ 0) && ( !(x ^ (x & ~x+1)) ))
进入~(~((x ^ 0) & !(x ^ (x & ~x+1)) ) & ~((x ^ 0) & !(x ^ (x & ~x+1))))
似乎并没有达到目的。
编辑:我添加了一些额外的信息,希望我的问题现在更清楚了。
最佳答案
问题写得很糟糕,但很有趣试试这个
int isPower2(int x) {
return !(x^(x&~x+1))&!!x;
}
更易读的版本+解释
int isPower2(int x) {
return
(!(
x^(
x&((~x)+1)
)
))
&
(!!x);
}
此代码基于以下事实:2 的幂在二进制表示中具有单个 1
x&((~x)+1)
- 如果 x
是 2 或 1 的幂,则给出 x
,否则给出
1 (0001) -> 0001 & (1110+1) -> 0001 & 1111 -> 0001
2 (0010) -> 0010 & (1101+1) -> 0010 & 1110 -> 0010
3 (0011) -> 0011 & (1100+1) -> 0011 & 1101 -> 0001
4 (0100) -> 0100 & (1011+1) -> 0100 & 1110 -> 0100
5 (0101) -> 0101 & (1010+1) -> 0101 & 1011 -> 0001
我们将结果与 x
进行异或,因为我们得到了 2 和 1
的幂 x
,所以我们得到 0
code> 仅适用于 2 的幂。
稍后我们对结果进行逻辑反转,得到 2 的幂 1
。
为了消除 0
情况,我们与两次逻辑反转的 x
关于将 AND 更改为 NAND 逻辑在 C 中不再起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23720399/
我是一名优秀的程序员,十分优秀!