gpt4 book ai didi

将 AND 更改为 NAND 逻辑在 C 中不再起作用

转载 作者:行者123 更新时间:2023-11-30 20:14:52 27 4
gpt4 key购买 nike

我试图找到一种算法......

  • ...返回 1(如果 x == 2^n)//2^n 是“2 的 n 次方”而不是异或。
  • ...返回 0 (if x != 2^n && x == 0)//2^n 是“2 的 n 次方”而不是异或。

我可能假设我的机器适用于:

  • 二进制补码,
  • 整数的 32 位表示,
  • 执行算术右移,
  • 将整数移位超过字长时会出现不可预测的行为。

我也只能使用以下运算符:! ~ & ^ | + << >>

这是我到目前为止得到的:

int isPower2(int x) {
return ( !(x ^ (x & ~x+1)) )); // But this returns 1 if x == 0.
}

为了使此代码正常工作,我将其更改为 ((x ^ 0) && ( !(x ^ (x & ~x+1) 。但我不被允许使用&& 。所以我必须建立一个ANDNANDs使用~&运算符。

但我知道,我可以用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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com