C 中是否有像 Verilog 中那样的一元按位归约运算符?
就像在 Verilog 中一样,我们有:
$display (" & 4'b1001 = %b", (& 4'b1001));
上面函数的输出是:
& 4'b1001 = 0
我在C中找不到类似的操作符。C语言中有这样的操作吗?
!~x
或
~x == 0
用作按位 AND;当且仅当
x
的每一位都是 1 时,它才为 1。
!!x
或
x != 0
用作按位或;如果
x
的任何一位为 1,则为 1。否定,不正确地称为 NAND 或 NOR,因为它们不以按位方式应用 NAND 或 NOR,而是将 NOT 应用于按位 AND 或 OR,只是
!!~x
或
~x != 0
和
!x
或
x == 0
。C 标准规定的运算中没有按位异或。 GCC 有
__builtin_parity
可以提供此功能。以上适用于
x
的全宽。可以通过将额外位设置为单位元素来实现更窄的宽度(1 表示 AND,0 表示 OR 和 XOR)。
bool
,它实际上是一位。例如:
bool and_reduction_4_bits(int n) {
return !(~n & 0b1111); // C23 adds binary literals
}
bool or_reduction(int n) {
return n; // works for any number of bits
}
popcount()
函数来执行此操作。如果没有,您可以使用bit twiddling hacks 创建自己的函数。
bool xor_reduction(int n) {
return popcount(n) & 1;
}