按位运算符将0转换为1,将1转换为0

5
在 C 语言中,假设我有一个 unsigned char 类型的 A,它只能为 0 或 1。 我想要寻找一个按位逻辑运算符,将 A 转换为 !A。
注意:我在 GPU 上使用此代码,与逻辑运算符相比,按位运算符非常便宜。即 XOR 比 ! 更便宜。

1
“!A”是什么意思?这没有任何意义,也不存在字符的倒置。 - specializt
3个回答

15

如果你的意思是将1发送到0并将0发送到1,则可以使用异或运算符^来实现。如果字符被称为c,你可以写成c = c ^ 1;


1
另外,如果我将一个真布尔表达式视为字符,那么该字符是否等于1?即 char test = (A == 1); 在这种情况下,test是否等于1? - Jacko
@Jacko 是的。另外,你应该使用另一个答案中的 A = !A;c = c ^ 1 只会反转 char 的第一位,我不知道你为什么需要这样做。 - HolyBlackCat
谢谢,HolyBlackCat。但是,如果c == 0,则c ^ 1将等于1。如果c == 1,则c ^ 1将等于0。所以这就是我要找的。 - Jacko
谢谢你,saadtaame。非常有帮助。 - Jacko

6

您应该使用"逻辑非"运算符:

A = !A;

您也可以使用"按位取反"运算符,但这样会使您的代码更难理解,因为实际上您所做的是逻辑非操作:

A = ~A;


1
我已经中和了负评;我认为你的答案很直观! - Poriferous
谢谢。我正在尝试避免逻辑运算符。我已经将这个问题添加到了问题中。 - Jacko
我不知道其他编程语言,但在C#中,如果使用“~”,你会得到负数,如果使用“!”,则会出现错误。 - Raja

1

如果你只需要一个可以反复切换的标志,使用1进行异或赋值非常方便。

$ clang -x c -include stdio.h -pipe -o meh - <<\EOF && ./meh
int main(int argc, char **argv) {
    unsigned char x = '\0';
    for (int n = 0; n <= 50; n++) printf("%d", x ^= 1);
    return 0;
}
EOF

101010101010101010101010101010101010101010101010101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接