C和C++程序员面试秘笈:28---设置或清除特定的位、计算一个字节中有多少bit被置1、使用位运算交换数字

一、设置或清除特定的位

  • bit从0开始算起
  • 下面的代码是将全局变量的第3bit位置1或置0
#include 

// 将第3位置1
#define BIT3 (0x1 << 3)
static int a;

// 将a的第3位置1
void set_bit3(void)
{
    a |= BIT3;
}

// 将a的第3位置0
void clear_bit3(void)
{
    a &= ~BIT3;
}

int main()
{
    set_bit3();
    printf("%d\n", a);

    clear_bit3();
    printf("%d\n", a);

    return 0;
}

二、实现一个宏,用来将指定的bit位置1

  • 下面定义了:
    • BIT_MASK宏:将指定的bit位置1
    • Bit_Set()函数:输入一个数,将指定的bit位置1
    • Bit_Reset()函数:输入一个数,将指定的bit位置0
#include 

// 将指定的bit位置1
#define BIT_MASK(bit_pos) (0x1 << (bit_pos))

// 将val指定的pos位置置1
// 设置成功函数返回1, 失败返回0
int Bit_Set(unsigned int* val, unsigned char pos)
{
    // 判断位置是否超出了整型的字节返回
    if(pos >= sizeof(unsigned int)*8)
        return 0;

    *val |= BIT_MASK(pos);

    return 1;
}

// 将val指定的pos位置置0
int Bit_Reset(unsigned int* val, unsigned char pos)
{
    if(pos >= sizeof(unsigned int)*8)
        return 0;

    *val &= (~BIT_MASK(pos));

    return 1;
}

int main()
{
    int a = 0;

    Bit_Set(&a, 0);
    printf("%d\n", a); //0000
    
    Bit_Reset(&a, 0);
    Bit_Set(&a, 1);
    printf("%d\n", a); //0010

    Bit_Reset(&a, 1);
    Bit_Set(&a, 2);
    printf("%d\n", a); //0100

    Bit_Reset(&a, 2);
    Bit_Set(&a, 3);
    printf("%d\n", a); //1000

    return 0;
}

 C和C++程序员面试秘笈:28---设置或清除特定的位、计算一个字节中有多少bit被置1、使用位运算交换数字_第1张图片

三、计算一个字节中有多少bit被置1

#include 

// 将第7位置1
#define BIT7 (0x1 << 7)

int calculate(unsigned char c)
{
    int count = 0;
    int i = 0;
    unsigned char comp = BIT7;

    for(i; i < sizeof(c) * 8; i++)
    {
        if((c & comp) != 0)
            count++;
        comp = comp >> 1;
    }

    return count;
}

int main()
{
    unsigned char c = 0;
    int count = 0;

    printf("Please enter: ");
    scanf("%hhd", &c);

    count = calculate(c);
    printf("count: %d\n", count);

    return 0;
}
  • 一个字节(byte)有8位,首先宏定义BIT7将最高位置为1,然后在calculate函数中比较每个位是否被置成1,如果是,则count++,循环结束返回count的值
  • 下面我们输入97(二进制为1100001),最后打印count为3

你可能感兴趣的:(C和C++程序员面试秘笈)