【问题标题】:C: flip integer value as a booleanC:将整数值翻转为布尔值
【发布时间】:2018-10-22 20:05:27
【问题描述】:

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

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

这是一个8位处理器的老硬件,所以使用boolean的想法是不可能的,我无法安装外部库。

【问题讨论】:

  • 你的问题不清楚。 “翻转”是什么意思?也许否定? C 已经将整数视为书籍和。事实上,C 中没有特殊的布尔类型。零被解释为假,任何其他值 - 都被解释为真。
  • 无论如何你都可以做到val = !val ....
  • 在 C 中,零是假的,其他一切都是真的。看起来你想要一个真实的,而其他的一切都是虚假的。在这种情况下,您可以简化为val = val != 1;。否则,val = !val 工作正常。

标签: c


【解决方案1】:

在 C 中,值 0 被认为是“假”,而任何其他(非零)值被认为是“真”。因此,将任意 int 值转换为显式真或假布尔值的一种非常明确的方法是使用(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 进行显式比较几乎总是一个坏主意,即使不是彻头彻尾的错误。

【讨论】:

  • 此答案假定您的编译器支持 C99 功能。并非所有编译器都普遍且等效地支持 C99 功能。
  • @AlexReynolds 你的意思是输入bool?没错,但其他一切都可以一直工作到 C72。 (而 1999 年几乎是 20 年前...)
  • @AlexReynolds 2018 年有哪些非 C99 编译器不支持 bool 的示例?
  • 此外,这个答案应该添加一个#include &lt;stdbool.h&gt;,并且编译器需要以 C99 或更高版本为目标,假设支持此功能。
  • @AlexReynolds 添加了对&lt;stdbool.h&gt; 的提及,谢谢。
【解决方案2】:

添加到峰会的答案,您也可以这样做:

#define TRUE ~0U
#define FALSE 0U

#ifndef BOOL
#define BOOL unsigned int;
#endif

int main() {
    BOOL var = TRUE;
    var = ~var; //Negate var and set it to false.
    var = ~var; //Negate var again and set it to true.
    return EXIT_SUCCESS;
}

如果您至少使用 C99,那么您可以更改

#ifndef BOOL
#define BOOL unsigned int;
#endif

到:

#include <stdint.h>

#ifndef BOOL
#define BOOL uint_fast8_t;
#endif

【讨论】:

  • 不可移植 - 有符号类型的所有按位运算都是实现定义的。另外,它比峰会的答案要清楚得多。
【解决方案3】:

我发布了一个答案,但我可能误读了这个问题。如果你有一个整数变量——它可能是intshort intchar——并且你想让它来回循环 0、1、0、1(你可以解释为 false,真,假,真),有两种同样好的方法可以做到这一点。你可以这样做:

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 以外的任何值),它也会做错事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2016-11-28
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多