c - C中位运算符的应用及其效率?

标签 c bitwise-operators masking

<分区>

我是位运算符的新手。

我了解逻辑函数如何工作以获得最终结果。例如,当您按位 AND 两个数字时,最终结果将是这两个数字的 AND (1 & 0 = 0 ; 1 & 1 = 1; 0 & 0 = 0)。与 ORXORNOT 相同。

我不明白的是他们的应用。我试着到处寻找,其中大部分只是解释按位运算的工作原理。在所有的位运算符中,我只了解移位运算符(乘法和除法)的应用。我也遇到了掩蔽。我知道屏蔽是使用按位 AND 完成的,但它的目的到底是什么,我可以在哪里以及如何使用它?

您能否详细说明我如何使用 mask ? ORXOR 有类似的用途吗?

最佳答案

按位运算符的低级用例是执行以 2 为底的数学运算。有一个众所周知的技巧来测试一个数字是否是 2 的幂:

if ((x & (x - 1)) == 0) {
    printf("%d is a power of 2\n", x);
}

但是,它还可以提供更高级别的功能:设置操作。您可以将比特的集合视为一个集合。解释一下,让一个字节中的每一位代表 8 个不同的项目,比如我们太阳系中的行星(冥王星不再被视为行星,所以 8 位就足够了!):

#define Mercury (1 << 0)
#define Venus   (1 << 1)
#define Earth   (1 << 2)
#define Mars    (1 << 3)
#define Jupiter (1 << 4)
#define Saturn  (1 << 5)
#define Uranus  (1 << 6)
#define Neptune (1 << 7)

然后,我们可以像使用 | 一样形成行星的集合(子集):

unsigned char Giants = (Jupiter|Saturn|Uranus|Neptune);
unsigned char Visited = (Venus|Earth|Mars);
unsigned char BeyondTheBelt = (Jupiter|Saturn|Uranus|Neptune);
unsigned char All = (Mercury|Venus|Earth|Mars|Jupiter|Saturn|Uranus|Neptune);

现在,您可以使用 & 来测试两个集合是否有交集:

if (Visited & Giants) {
    puts("we might be giants");
}

^ 操作通常用于查看两个集合之间的不同之处(集合的并集减去它们的交集):

if (Giants ^ BeyondTheBelt) {
    puts("there are non-giants out there");
}

因此,将 | 视为并集,将 & 视为交集,并将 ^ 视为并集减去交集。

一旦您接受了位表示集合的想法,那么位运算自然会帮助操作这些集合。

关于c - C中位运算符的应用及其效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17181323/

相关文章:

c - 创建 HMAC 签名时出现问题

java - 如何将以下引用变量转换为 Java JNA?

java - 为什么 (char)194 == 'Â' 而不是 (char)182 == 'Â'

python - Keras 中具有掩蔽支持的均值或最大池化

c - 在 C 中的字符串反转期间释放指针时出现段错误

c++ - 无法从 "char*"转换为 "char"

c++ - 使用按位运算符消除 IF 语句

c++ - 关于 C++ 中的移位运算符

html - SVG Mask 不适用于插画师生成的 SVG(所有浏览器)

android - 如何在android中使用renderscript使用smoothstep函数