【位操作】——常用位操作

第 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) 用于生成一个指定范围的位掩码。它接受两个参数 se ,分别表示位范围的 起始位置结束位置
以下是一个示例:

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 位是否被清除。

运行程序将输出:

指定的位未清除。

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/131948487
今日推荐