我正在寻找一种方法来使用它作为布尔值(0 - > False,1 - > True)来翻转整数值(8位)。
在许多语言中,您可以val = !val
更改值。我唯一做的就是val = (val == 1) ? 0 : 1
。我不知道在C中是否可以使用咬合值。
它适用于具有8位处理器的旧硬件,因此无法使用boolean
,我无法安装外部库。
答案 0 :(得分:3)
在C中,值0被视为“假”,任何其他(非零)值被视为“真”。因此,将任意int
值转换为明确的true-or-false布尔值的一种非常明确的方法是使用(C99及更高版本)bool
类型:
#include <stdbool.h>
int i;
bool b;
b = (i != 0) ? true : false;
但是由于!=
运算符实际上“返回”一个布尔值,所以你也可以
b = (i != 0);
由于零/非零定义内置于语言中,您也可以执行
b = i;
但您不必使用bool
类型。如果你有一个任意值的int并且你想强制它为0/1“就地”,你有相同的选择:
i = (i != 0) ? 1 : 0;
或者
i = (i != 0);
或者还有另一种常见技巧:
i = !!i;
这最后一个是简洁,流行,有点模糊。它将零/非零变为1/0,然后再变回0/1。
我已使用int
类型显示了这些示例,但它们与short int
或char
(即字节)的效果一样。
还有一件事。在你的问题中你写了val = (val == 1) ? 0 : 1
,但这基本上没有意义。在C中,至少,一切(一切!)都是从值是零还是非零。与1进行显式比较几乎总是一个坏主意,如果不是一个彻头彻尾的错误。
答案 1 :(得分:1)
我发布了一个答案,但我可能误解了这个问题。如果你有一个整数变量 - 它可能是int
,short int
或char
- 并且你想让它来回循环0,1,0,1(其中你可以解释为假,真,假,真,有两个同样好的方法来做到这一点。你可以这样做:
i = !a;
这第一种方式强调变量的“布尔”性质。 或者,您可以这样做:
i = 1 - i;
第二种方式纯粹是数字化的。
但无论哪种方式都能很好地发挥作用。在任何一种情况下,i
都保证交替0,1,0,1,......
您也可以使用
i = i ? 0 : 1;
或
i = (i == 0) ? 1 : 0;
这两种方法也有效,但它们基本上等同于i = !i
。
在你提出的问题中
i = (i == 1) ? 0 : 1;
这大部分都会奏效,但我的眼睛看起来很怪异。如果i
最终包含2(或除0或1之外的任何值),它也会做错事。