c - 按位取反检查

标签 c bit-manipulation

我正在阅读 JS 手册,发现了一个不错的技巧,即 ~val === (val != -1)。 我发现它很好,并且想在我的 C 代码中使用它。

它是可移植的吗?我检查了我的 GNU/Linux 机器,它可以工作。

编辑:看来我问得不太清楚。当然,我知道,C中没有===。 问题是,两者都是条件

int val;
if (~val) {...}
if (val != -1) {...} 

相等吗?

最佳答案

以下答案是针对该问题最初的措辞而写的,这导致我自己和其他人认为他是在问 ~ans(ans ^ -1 ) 是等价的。

这个技巧不像~val那样可移植,因为它假设-1 == 0b111111111...,这仅在二进制补码机器上成立(当然) ,这几乎适用于当今的任何机器)。它利用了异或运算作为“受控反相器”的事实,翻转其左操作数中对应的右操作数位为 1 的每一位。

但是,用 ~0 替换 -1 可能会起作用。

关于c - 按位取反检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12970790/

相关文章:

sql - 如何对存储在表中的值执行按位运算并在sql查询的where子句中使用它?

我可以进行优化,但不受重新排序语句的影响吗?

c - 如何编写一个 C 函数来不断读取一组行并标记行的长度

javascript - 无符号右移函数不适用于负输入

C++ - 给定多个二进制字符串,如果所有给定字符串的第 n 位相同,则生成第 n 位被设置的二进制字符串

c++ - 将 short 打包/解包为 int

java - 计算hashCode时转换数据类型

c - 为什么从 main() 向函数传递链表指针会影响 main 中的链表?

c - 指针数组

c++ - 在 c/c++ 中使用 pthread_cond_wait 和 pthread_cond_signal 以循环方式执行多个线程