第 N 位置 1
#define BIT(n) (1<<(n))
这个宏定义 BIT(n) 用于生成一个指定位置为 1,其余位置为 0 的整数。它接受一个参数 n ,表示要设置为 1 的二进制位的位置。
以下是一个示例
int num = BIT(3);
在这个例子中, num 将被赋值为 8,因为 BIT(3) 会生成一个二进制为 00000000000000000000000000001000 的整数,其中第 3 位为 1,其余位为 0。
该宏通常用于位运算,可以用于设置、清除或检查某个特定位置的位。例如,可以使用该宏来设置一个整数的第 n 位为 1,如下所示:
int num = 0;
num |= BIT(2); /* 设置第 2 位为 1 */
在这个例子中, num 的二进制表示为 00000000000000000000000000000100,第 2 位已被设置为 1。
另外,可以使用该宏来检查一个整数的特定位是否为 1,如下所示:
int num = 10; /* 二进制表示为 00000000000000000000000000001010 */
if (num & BIT(1))
{
printf("第 1 位为 1\n");
} else
{
printf("第 1 位为 0\n");
}
在这个例子中,输出将是 第 1 位为 0,因为 num 的第 1 位为 0。
总之, BIT(n) 宏用于生成一个在指定位置上为 1 的整数,可以用于位运算中的设置、清除和检查特定位的操作。
生成指定长度的位掩码
#define BIT_MASK_LEN(len) (BIT(len)-1)
这个 C 语言宏 BIT_MASK_LEN(len) 用于生成一个指定长度的位掩码。它接受一个参数 len ,表示要生成的位掩码的长度。
以下是一个示例:
int mask = BIT_MASK_LEN(4);
在这个例子中, mask 将被赋值为 15,因为 BIT_MASK_LEN(4) 会生成一个二进制为 00000000000000000000000000001111 的整数,其中低 4 位都为 1,其余位为 0。
该宏的作用是生成一个具有指定长度的二进制位全为 1 的整数。这个位掩码可以用于位运算中的掩码操作,例如与操作、或操作和位移操作等。
例如,可以使用该宏来进行位与操作,将一个整数的指定位清零,如下所示:
int num = 255; /* 二进制表示为 00000000000000000000000011111111 */
int mask = BIT_MASK_LEN(4); /* 二进制表示为 00000000000000000000000000001111 */
num &= ~mask; /* 清零低 4 位 */
在这个例子中, num 的二进制表示为 00000000000000000000000011110000 ,低 4 位已被清零。
总之, BIT_MASK_LEN(len) 宏用于生成一个指定长度的位掩码,可以用于位运算中的掩码操作,如清零指定位、提取指定位等操作。
生成指定范围的位掩码
#define BIT_RNG(s, e) (BIT_MASK_LEN((e)-(s) + 1) << (s))
这个宏 BIT_RNG(s, e) 用于生成一个指定范围的位掩码。它接受两个参数 s 和 e ,分别表示位范围的 起始位置 和 结束位置。
以下是一个示例:
int mask = BIT_RNG(2, 5);
在这个例子中, mask 将被赋值为 60,因为 BIT_RNG(2, 5) 会生成一个二进制为 00000000000000000000000000111100 的整数,其中位 2 到位 5 都为 1,其余位为 0。
该宏的作用是生成一个具有指定范围的二进制位全为 1 的整数。这个位掩码可以用于位运算中的掩码操作,例如与操作、或操作和位移操作等。
例如,可以使用该宏来进行位与操作,提取一个整数的指定位范围,如下所示:
int num = 255; /* 二进制表示为 00000000000000000000000011111111 */
int mask = BIT_RNG(2, 5); /* 二进制表示为 00000000000000000000000000111100 */
int result = num & mask; /* 提取位 2 到位 5 的值 */
在这个例子中, result 的二进制表示为 00000000000000000000000000111100 ,即位 2 到位 5 的值被提取出来。
指定的位置位
#define BM_SET(x, mask) ((x) |= (mask))
这个宏 BM_SET(x, mask) 的作用是将变量 x 中指定的位掩码 mask 设置为 1。它通过使用位或运算符来实现。
#include <stdio.h>
#define BM_SET(x, mask) ( (x) |= (mask) )
int main()
{
int num = 0; /* 二进制表示为 00000000000000000000000000000000 */
int mask = 15; /* 二进制表示为 00000000000000000000000000001111 */
BM_SET(num, mask); /* 将位 0 到位 3 设置为 1 */
printf("num: %d\n", num);
printf("mask: %d\n", mask);
return 0;
}
在这个示例中,我们定义了宏 BM_SET 用来将指定的位掩码设置为 1。在 main() 函数中,我们定义了一个整数 num ,其二进制表示为 00000000000000000000000000000000 。我们还定义了一个位掩码 mask ,其二进制表示为 00000000000000000000000000001111 。然后,我们使用 BM_SET(num, mask) 将 num 中位 0 到位 3 的值设置为 1。最后,我们将结果打印输出。
运行程序,输出如下:
num: 15
mask: 15
可以看到, num 的值为 15, mask 的值为 15。这说明我们成功地将 num 中位 0 到位 3 的值设置为 1,得到了期望的结果。
指定的位清零
#define BM_CLR(x, mask) ((x) &= ~(mask))
这个宏 BM_CLR(x, mask) 的作用是将变量 x 中指定的位掩码 mask 清除为 0。它通过使用位与运算符和位取反运算符来实现。
下面是一个详细示例:
#include <stdio.h>
#define BM_CLR(x, mask) ((x) &= ~(mask))
int main()
{
int num = 15; /* 二进制表示为 00000000000000000000000000001111 */
int mask = 6; /* 二进制表示为 00000000000000000000000000000110 */
BM_CLR(num, mask); /* 将位 1 和位 2 清除为 0 */
printf("num: %d\n", num);
printf("mask: %d\n", mask);
return 0;
}
在这个示例中,我们定义了宏 BM_CLR 用来将指定的位掩码清除为 0。在 main() 函数中,我们定义了一个整数 num ,其二进制表示为 00000000000000000000000000001111 。我们还定义了一个位掩码 mask ,其二进制表示为 00000000000000000000000000000110 。然后,我们使用 BM_CLR(num, mask) 将 num 中位 1 和位 2 的值清除为 0。最后,我们将结果打印输出。
num: 9
mask: 6
可以看到, num 的值为 9, mask 的值为 6。这说明我们成功地将 num 中位 1 和位 2 的值清除为 0,得到了期望的结果。
指定的位翻转
BM_FLIP(x, mask) ((x) ^= (mask))
宏 BM_FLIP(x, mask) 用于将变量 x 中由 mask 指示的位翻转(取反)。它使用 按位异或运算符 来执行翻转操作。
#include <stdio.h>
#define BM_FLIP(x, mask) ((x) ^= (mask))
int main()
{
int num = 15; /* 二进制表示:00000000000000000000000000001111 */
int mask = 6; /* 二进制表示:00000000000000000000000000000110 */
BM_FLIP(num, mask);
printf("翻转后的结果:%d\n", num);
return 0;
}
在这个示例中,我们定义了宏 BM_FLIP 来翻转变量 num 中由 mask 指示的位。变量 num 的二进制表示为 00000000000000000000000000001111 ,而变量 mask 的二进制表示为 00000000000000000000000000000110 。我们使用 BM_FLIP(num, mask) 宏来翻转 num 中的第 1 位和第 2 位。运行程序后,它将打印翻转后的结果。
翻转后的结果:9
指定的位掩码是否置位
宏 BM_IS_SET(x, mask) 用于检查变量 x 中由 mask 指示的位是否被设置为 1。它使用按位与运算符来执行检查。
#include <stdio.h>
#define BM_IS_SET(x, mask) ((x) & (mask))
int main()
{
int num = 15; /* 二进制表示:00000000000000000000000000001111 */
int mask = 6; /* 二进制表示:00000000000000000000000000000110 */
if (BM_IS_SET(num, mask))
{
printf("指定的位已设置。\n");
}
else
{
printf("指定的位未设置。\n");
}
return 0;
}
在这个示例中,我们定义了宏 BM_IS_SET 来检查变量 num 中由 mask 指示的位是否被设置。变量 num 的二进制表示为 00000000000000000000000000001111 ,而变量 mask 的二进制表示为 00000000000000000000000000000110 。我们使用 BM_IS_SET(num, mask) 宏来检查 num 中的第 1 位和第 2 位是否被设置。如果指定的位被设置,它将打印 “指定的位已设置”;否则,它将打印 “指定的位未设置”。
运行程序将输出:
指定的位已设置。
这表明在变量 num 中指定的位(第 1 位和第 2 位)确实被设置为 1。
指定的位是否清零
#define BM_IS_CLR(x, mask) ((~x) & (mask))
宏 BM_IS_CLR(x, mask) 用于检查变量 x 中由 mask 指示的位是否被清除为 0。它使用按位与运算符和按位取反运算符来执行检查。
#include <stdio.h>
#define BM_IS_CLR(x, mask) ((~x) & (mask))
int main()
{
int num = 15; /* 二进制表示:00000000000000000000000000001111 */
int mask = 6; /* 二进制表示:00000000000000000000000000000110 */
if (BM_IS_CLR(num, mask))
{
printf("指定的位已清除。\n");
}
else
{
printf("指定的位未清除。\n");
}
return 0;
}
在这个示例中,我们定义了宏 BM_IS_CLR 来检查变量 num 中由 mask 指示的位是否被清除。变量 num 的二进制表示为 00000000000000000000000000001111 ,而变量 mask 的二进制表示为 00000000000000000000000000000110 。我们使用 BM_IS_CLR(num, mask) 宏来检查 num 中的第 1 位和第 2 位是否被清除。
|