逍遥自在学C语言 | 位运算符<<的高级用法

Posted Wayne_hzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逍遥自在学C语言 | 位运算符<<的高级用法相关的知识,希望对你有一定的参考价值。

前言

在上一篇文章中,我们介绍了~运算符的高级用法,本篇文章,我们将介绍<< 运算符的一些高级用法。

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

  • 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

二、计算2的整数次幂

  • 代码示例
#include <stdio.h>
int main() 

    int x = 1;
    printf("请输入2的次方数:");
    scanf("%d",&x);
    int y = 1 << x; 
    printf("\\n2的%d次方 = %d\\n",x,y);
    return 0;

  • 运行结果

三、将一个字节序列合并为一个整数

  • 例如,将4个字节组成的字节序列b合并为一个整数
  • 代码示例
#include <stdio.h>

int main() 

    unsigned char b[4] = 0x12, 0x34, 0x56, 0x78;
    unsigned int x = ((unsigned int)b[0] << 24) | ((unsigned int)b[1] << 16) |((unsigned int)b[2] << 8) | ((unsigned int)b[3]);
    printf("合并后的整数 = 0x%08x\\n", x);
    return 0;

  • 运行结果

下面介绍的两种用法,会用到& | ^的知识

如果有不清楚的,可以查看之前的文章:位运算符的基础用法

四、标记码

1、标记位置1

  • 例如,将0xF8的第2位(从第0位开始数,由低位到高位) 置1
  • 代码示例
#include <stdio.h>
int main() 

    int x = 0xF8;
    x |= 1<<2; 
    printf("x = 0x%0x\\n",x);
    return 0;

  • 运行结果

2、标记位置0

  • 例如,将0xF8的第3位(从第0位开始数,由低位到高位) 置0
  • 代码示例
#include <stdio.h>
int main() 

    int x = 0xF8;
    x &= (~(1<<3)); 
    printf("x = 0x%0x\\n",x);
    return 0;

  • 运行结果

3、标记位取反

  • 例如,将0xF8的第3位和第2位(从第0位开始数,由低位到高位) 取反
  • 代码示例
#include <stdio.h>
int main() 

    int x = 0xF8;
    x ^= (3<<2);  // 3的二进制为0b11,左移2位刚好对应第2和第3位
    printf("x = 0x%0x\\n",x);
    return 0;

  • 运行结果

五、掩码

1、末尾连续N位都置1

  • 例如,将0xF8的低3位都置1
  • 代码示例
#include <stdio.h>
int main() 

    int x = 0xF8; // Ob1111 1000 
    x |= ((1<<3)-1);
    printf("x = 0x%0x\\n",x); // 0b1111 1111
    return 0;

  • 运行结果

2、末尾连续N位都置0

  • 例如,将0xFF的低4位都置0
  • 代码示例
#include <stdio.h>
int main() 

    int x = 0xFF;	// 0b1111 1111
    x &= ~((1<<4)-1);
    printf("x = 0x%0x\\n",x); // 0b1111 0000
    return 0;

  • 运行结果

3、末尾连续N位取反

  • 例如,将0xFA的低4位都取反
  • 代码示例
#include <stdio.h>
int main() 

    int x = 0xFA;	// 0b1111 1010
    x ^= ((1<<4)-1);
    printf("x = 0x%0x\\n",x); // 0b1111 0101
    return 0;

  • 运行结果

小结

通过这篇文章,我们学会了用位运算符<<的4种高级用法

1、计算2的整数次幂

2、将一个字节序列合并为一个整数

3、标记码

4、掩码

在下一篇文章中,我们将介绍位运算符>>的一些高级用法。

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

记录、总结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,与理论值吻合

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

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语言面试每日一题:位运算符的运用(1)

内容来自《C和C++程序员面试秘笈》,笔者知识有限,如果发现本文有错误的地方欢迎批评、指正,若本文对您有所帮助,转发、分享也是笔者坚持的动力

好文分享:


以上是关于逍遥自在学C语言 | 位运算符<<的高级用法的主要内容,如果未能解决你的问题,请参考以下文章

c语言编程将16位无符号数的高8位和低8位交换.

三道C语言位运算题目,求大神!

C语言中位移位运算符?

c语言的按位运算符怎么操作!?

位运算符

光天化日学C语言(19)- 位运算 >> 的应用 | 右移的一些高端用法