按位运算符将 0 转换为 1,将 1 转换为 0
Bitwise operator to convert 0 to 1 and 1 to 0
在 C 中,假设我有一个 unsigned char A,它可以是 0 或 1。
我想找到一个将转换的按位逻辑运算符
A 到 !A.
注意:我在 GPU 上使用此代码,与逻辑运算符相比,按位运算符的成本非常低。即 XOR 比 !
便宜得多
如果 'not' 你的意思是将 1 发送到 0,将 0 发送到 1。你可以使用 XOR 运算符 ^
来做到这一点。如果字符叫c,可以写成c = c ^ 1;
.
您应该使用 "logical not" 运算符:
A = !A;
您也可以使用 "bitwise not" 运算符,但这会使您的代码更难理解,因为您所做的实际上是逻辑非:
A = ~A;
如果您只需要一个标志来重复切换,则使用 1
的 XOR 赋值非常方便。
$ clang -x c -include stdio.h -pipe -o meh - <<\EOF && ./meh
int main(int argc, char **argv) {
unsigned char x = '[=10=]';
for (int n = 0; n <= 50; n++) printf("%d", x ^= 1);
return 0;
}
EOF
101010101010101010101010101010101010101010101010101
在 C 中,假设我有一个 unsigned char A,它可以是 0 或 1。 我想找到一个将转换的按位逻辑运算符 A 到 !A.
注意:我在 GPU 上使用此代码,与逻辑运算符相比,按位运算符的成本非常低。即 XOR 比 !
便宜得多如果 'not' 你的意思是将 1 发送到 0,将 0 发送到 1。你可以使用 XOR 运算符 ^
来做到这一点。如果字符叫c,可以写成c = c ^ 1;
.
您应该使用 "logical not" 运算符:
A = !A;
您也可以使用 "bitwise not" 运算符,但这会使您的代码更难理解,因为您所做的实际上是逻辑非:
A = ~A;
如果您只需要一个标志来重复切换,则使用 1
的 XOR 赋值非常方便。
$ clang -x c -include stdio.h -pipe -o meh - <<\EOF && ./meh
int main(int argc, char **argv) {
unsigned char x = '[=10=]';
for (int n = 0; n <= 50; n++) printf("%d", x ^= 1);
return 0;
}
EOF
101010101010101010101010101010101010101010101010101