C语言面试每日一题:位运算符的运用(1)

记录、总结C语言经典面试题,备忘

1.题目

计算一个字节里有多少位被置1

2.示例代码

/* 公众号:南风过境蜻蜓飞  */

#include "stdio.h"
#define BIT (0x1<<7)

int get_num(unsigned char );

int get_num(unsigned char x)
{
    
    
    int i;
    int count = 0;
    unsigned char comp = BIT;

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

int main(void)
{
    
    
    unsigned char a = 0;
    int num = 0;

    printf("请输入一个字节:");
    scanf("%d",&a);
    num = get_num(a);
    printf("输入的一个字节里有%d位被置1\r\n",num);

    return 0;
}

3.代码分析、验证

题目主要考察位运算符的运用。解题方法:将一个字节里的8位分别判断是否被置为1

一个字节(byte)有8位,计算一个字节里有多少位被置1,首先在宏定义中将最高位置1,然后循环比较每个位是否被置成1,若是,则count++,循环结束返回返回count的值

测试:在VS Code 里编写以上代码,编译运行,输入值66(二进制:1000010),按照理论,代码运行结束后,返回的count值应该为2

测试如下,输入66,返回的count值为2,与理论值吻合

4.扩展

上面的代码我们是将宏定义最高位置1,然后循环比较每一位,对原代码做简单改动,将宏定义最低位置1,然后循环比较每一位,也可达到一样的效果,代码如下:

/* 公众号:南风过境蜻蜓飞  */

#include "stdio.h"
#define BIT (0x80>>7)

int get_num(unsigned char );

int get_num(unsigned char x)
{
    
    
    int i;
    int count = 0;
    unsigned char comp = BIT;

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

int main(void)
{
    
    
    unsigned char a = 0;
    int num = 0;

    printf("请输入一个字节:");
    scanf("%d",&a);
    num = get_num(a);
    printf("输入的%d有%d位被置1\r\n", a, num);

    return 0;
}

测试如下,输入66,返回的count值为2,与理论值吻合

内容主要来自《C和C++程序员面试秘笈》,笔者知识有限,如果发现本文有错误的地方欢迎批评、指正,若本文对您有所帮助,转发、分享也是笔者坚持的动力;若有需要,扫码关注公众号,后台回复 C面试 获取《C和C++程序员面试秘笈》PDF版

猜你喜欢

转载自blog.csdn.net/qq_42965739/article/details/108288165
今日推荐