资讯专栏INFORMATION COLUMN

C语言 位运算符详解 (使用二进制实例深入学习理解位运算符使用原理)

1treeS / 1229人阅读

摘要:位运算符是对其操作数按其二进制形式逐位进行运算。接下来我们逐一讲解位运算符的计算原理按位与用于清零取某些指定位保位的计算原理,,结果上面使用按位与的一段程序运行结果为我们用二进制来分析一下它的计算规则。

C语言中位运算符共有六种

目录

1.&(按位与)

2. |(按位或)

3.^(按位抑或)

4.~(按位取反)

5.<<(左移)

6. >>(右移)

位( bit 是计算机中表示信息的最小单位,一般用 0和 1表示。位运算符是对其操作数按其二进制形式逐位进行运算。
注: 参加位运算的 操作数必须为整数。
接下来我们逐一讲解位运算符的计算原理
1.&(按位与)
  用于清零、取某些指定位、保位
(&的计算原理)
0 & 0 = 0,     1 & 0 = 0,    1 & 1 = 1.
#includeint main(void){	int a=3,b=5,c;	c=a&b;	printf("%d",c);  //结果c=1	return 0; 

上面使用 按位与&  的一段程序运行结果为c=1

 我们用二进制来分析一下它的计算规则。

a=3  二进制为 0000 0011

b=5  二进制为 0000 0101


a&b  的意思就是01算法,通俗来讲a和b的第八位都为1,所以第8位&后的结果为1,前面7位&后的结果都为0

按位计算结果是0000 0001


所以最终c=a&b的结果为c=1

1)清零 

#includeint main(void){	int a=3,b=0,c;	c=a&b;	printf("%d",c);  //结果c=0	return 0; 

a=3  二进制为 0000 0011

b=0  二进制为 0000 0000


a&b  8个位的运算结果都为0

所以最终c=0

(2) 取某些指定位

假定a=5,二进制为0000 0011

我们要取a的第3黑第6位

只需计算

0000 0101和1111 1111的结果

可得 c的二进制为0000 0101

所以a的第3位为0,第6位为1

 (3)保位

 例如计算a&b要保a的哪一位,只需将b中对应的位设为1,其余的位设为0.即可实现a的保位

2. |(按位或)用于对一个数据的某些位定值为1

对应位之间按位或的计算 即  0 | 0= 0 ,  1 | 0= 1  , 0 | 1= 1  ,  1 | 1= 1 

( | 的计算原理)

#includeint main(void){	int a=3,b=5,c;	c=a|b;	printf("%d",c);  //c的结果=7	return 0; 

 c=a|b

a=3  二进制为 0000 0011

b=5  二进制为 0000 0101

计算结果为0000 0111 即c=7

3.^(按位抑或)

(计算原理)

对应位置见的抑或运算,相同为0,相异为1

即 0 ^ 0=0  , 0 ^ 1= 1  , 1 ^ 0= 1  , 1 ^ 1= 0 。

#includeint main(void){	int a=3,b=5,c;	c=a^b;	printf("%d",c);//c的结果为6	return 0; 

c=a^b

a=3  二进制为 0000 0011

b=5  二进制为 0000 0101

计算结果为0000 0110 即c=6

 4.~(按位取反)

#includeint main(void){	int b=5,c;	c=~b;	printf("%d",c);//c的结果为-6	return 0; 

b=5  b的二进制为0000 0101

~b为1111 1010,用十进制表示即为-6。

5.<<(左移) 

右边空出的位用 0 填补,高位左移溢出则舍弃该高位。左移1 位相当于该数乘以 2 ,但只 适用于该数左移时被溢出舍弃的高位中不包含1 的情况。
#includeint main(void){	int b=5,c,d;	c=b<<1;	d=b<<3;	printf("c=%d d=%d",c,d);//最终结果c=10,d=40	return 0; 

b<<左移n个单位即b乘以2^n

 6. >>(右移)

#includeint main(void){	int b=40,c,d;	c=b>>1;	d=b>>3;	printf("c=%d d=%d",c,d);//结果为c=20,d=5	return 0; 

b<<左移n个单位即b除以2^n

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121670.html

相关文章

  • 深入理解计算机系统》·深入浅出·快速理解第2章(3日完稿)

    摘要:写在前面博客主页的江湖背景的江湖背景欢迎关注点赞收藏留言本文由原创,首发首发时间年月日最新更新时间年月日坚持和努力一定能换来诗与远方向未见花闻学习参考书籍深入理解计算机系统作者水平很有限,如果发现错误,请留言轰炸哦万分感谢感谢感谢 ?写在前面 ?博客主页:kikoking的江湖背景?...

    YJNldm 评论0 收藏0
  • 深入理解虚拟机之类文件结构

    摘要:对象创建与访问指令虽然类实例和数组都是对象,但虚拟机对类实例和数组的创建和操作使用了不同的字节码指令。异常处理指令在虚拟机中,处理异常语句不是由字节码指令来实现的,而是采用异常表的方式。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记与常见面试题总结 本节常见面试题(推荐带着问题阅读,问题答案在文中都有提到): 简单介绍一下Class类文件结构(常量池主要存放的是...

    张宪坤 评论0 收藏0
  • C语言操作符多图详解】——“讲述你所未知的操作符细节”

    摘要:今天小玄为大家带来语言的操作符相关的讲解,希望大家能通过这篇文章对相关操作符有更加深入的理解。操作符的两个操作数必须为整数。操作符的优先级操作符的结合性是否控制求值顺序。两个相邻的操作符先执行哪个取决于他们的优先级。         今天小玄为大家带来C语言的操作符相关的讲解,希望大家能通过...

    iliyaku 评论0 收藏0
  • C语言基础之操作符详解

    摘要:语言基础之操作符详解操作符的分类算术操作符移位操作符位操作符逻辑操作符逗号表达式表达式求值隐式类型转换算术转换操作符的属性今天就带各位大佬来了解一波语言的操作符。 ...

    snowell 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<