C:将整数值翻转为布尔值

时间:2018-05-12 17:01:02

标签: c

我正在寻找一种方法来使用它作为布尔值(0 - > False,1 - > True)来翻转整数值(8位)。

在许多语言中,您可以val = !val更改值。我唯一做的就是val = (val == 1) ? 0 : 1。我不知道在C中是否可以使用咬合值。

它适用于具有8位处理器的旧硬件,因此无法使用boolean,我无法安装外部库。

2 个答案:

答案 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 intchar(即字节)的效果一样。

还有一件事。在你的问题中你写了val = (val == 1) ? 0 : 1,但这基本上没有意义。在C中,至少,一切(一切!)都是从值是零还是非零。与1进行显式比较几乎总是一个坏主意,如果不是一个彻头彻尾的错误。

答案 1 :(得分:1)

我发布了一个答案,但我可能误解了这个问题。如果你有一个整数变量 - 它可能是intshort intchar - 并且你想让它来回循环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之外的任何值),它也会做错事。