C 中的按位归约运算符

问题描述 投票:0回答:2

C 中是否有像 Verilog 中那样的一元按位归约运算符?

就像在 Verilog 中一样,我们有:

$display (" & 4'b1001 = %b", (& 4'b1001));
上面函数的输出是:

& 4'b1001 = 0
我在C中找不到类似的操作符。C语言中有这样的操作吗?

c bit-manipulation verilog bitwise-operators bitwise-and
2个回答
3
投票
在 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)。


0
投票
没有专用的运算符,但在大多数情况下,您可以使用按位运算符获得相同的结果,并将结果转换为

bool

,它实际上是一位。例如:

    AND:按位取反,转换为布尔值,取反:
  • bool and_reduction_4_bits(int n) { return !(~n & 0b1111); // C23 adds binary literals }
    
    
  • OR:仅转换为 bool
  • bool or_reduction(int n) { return n; // works for any number of bits }
    
    
最棘手的是异或减少。如果您有办法计算设置的位数,然后检查该数字是否为奇数,则可以完成此操作。一些编译器提供内置

popcount()

 函数来执行此操作。如果没有,您可以使用 
bit twiddling hacks 创建自己的函数。

    XOR:计算位数,检查是否为奇数
  • bool xor_reduction(int n) { return popcount(n) & 1; }
    
    
© www.soinside.com 2019 - 2024. All rights reserved.