C语言位运算符详解「建议收藏」

C语言位运算符详解「建议收藏」目录位运算符简介1、按位与位运算符简介C语言既具有高级语言的特点,又具有低级语言的特性,如支持位运算就是其具体体现。这是因为,C语言1、按位与

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

位运算符

简介

C语言既具有高级语言的特点,又具有低级语言的特性,如支持位运算就是其具体体现。这是因为,C语言最初是为取代汇编语言设计系统软件而设计的,因此C语言必须支持位运算等汇编操作。位运算就是对字节或字内的二进制数位进行测试、抽取、设置或移位等操作。其操作对象不能是float、double、long double等其他数据类型,只能是char和int类型。
C语言提供如下表格的六种位运算符,其中,只有按位取反运算符为单目运算符,其他运算符都是双目运算符。

总概

位运算符

运算符 含义 类型 优先级 结合性
~ 按位取反 单目运算符 从右向左
<<,>> 按位左移、按位右移 双目运算符 从左向右
& 按位与 双目运算符 从左向右
^ 按位异或 双目运算符 从左向右
I 按位或 双目运算符 从左向右

补充:
单目运算符:只对一个操作数进行逻辑运算,例如:~a
双目运算符:只对两个操作数进行逻辑运算,例如:a & b
三目运算符:只对三个操作数进行逻辑运算且只有一个,例如:a ?b : c
其中a可以是表达式也可以是一个值,用于判断真假,若a为真,则结果为b;若a为假,则结果为c。
主要区别:操作数(常量或者变量)数量的不同。

位运算符的运算规则

a b a & b a I b a ^ b ~ a
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

下面我会对这些运算符的使用进行逐一解释说明:

1、按位与(&)

按位与可用于对字节中的某位清零,即两个操作数中的任意一位为0时,运算结果的对应位就会被置0。也可以简单记为(11为1,否则为0),例题如下,只保留15的最低位不变,在其余位均置为0,可用15 & 1来实现,即:


       00001111(15)

&    00000001 (1)

_____________________

      00000001 (1)



首先将15和1换为二进制形式,由11为1,否则为0算出二进制结果,最后得出十进制结果。其中,15和1均以补码形式表示,所以,15 & 1 = 1
代码如下:
在这里插入图片描述

2、按位与(I)

与按位与相反,按位或可用于对字节中的某位置1,即两个操作数中的任意一位为1时,运算结果的对应位就会被置为1。也可以简单记为(00为0,否则为1),例题如下,只保留15的最高位不变,而其余位均置为1,可用15 I 127 来实现,即:


    0  0  0  0  1  1  1  1(15)

I    0  1  1  1  1  1  1  1 (127)

_____________________

      0  1  1  1  1  1  1  1 (127)



首先将15和127换为二进制形式,由00为0,否则为1算出二进制结果,最后得出十进制结果。其中
01111111是127的补码,所以15 I 127 = 127
代码实现如下:
在这里插入图片描述

3、按位异或(^)

如果两个操作数的某对应位不一样,则按位异或结果的对应位为1,简单记为(相同为0,不同为1)。例如,3 ^ 5的运算过程可表示为:


       00000011(3)

&     00000101 (5)

_____________________

       00000110 (6)



首先将3和5华为二进制形式,由相同为0,不同为1算出二进制形式,再转化为十进制结果。其中,00000110是6的补码,所以3 ^ 5 = 6。
代码实现如下:
在这里插入图片描述

3、按位取反(~)

按位取反是对操作数的各位取反,即1变为0,0变为1。例如,~5的运算过程可以表示为:


~       00000101(5)

_____________________

         11111010 (-6)


首先将5化为二进制形式,由若1则0,若0则1得出二进制形式结果,在化为十进制即可。其中11111010是-6的补码,所以~5 = -6。
补充(负数的补码):C语言里面有原码,反码,补码这三种码,计算机里存储的数据都是补码形式,因为补码具有唯一的性质,补码的二进制形式中,首位数字如果是1,则十进制数字就是负数;如果是0,则二进制数字就是正数。对于负数的补码怎么求,我们可以先算出该负数的绝对值的二进制形式,再取反(即1变0,0变1),最后再加1,需要注意的是,二进制当中,两数相加为2则需进一位,与十进制中,两数相加为10则需进一位是一个道理。反之,已知负数的补码求十进制形式,我们倒推,则先减一,再取反,最后化为十进制结果就行了。
拓展:(了解)
按位取反常用于加密处理。例如,对文件加密时,一种简单的方法就是对每个字节按位取反,如下图所示:


初始字节内容        00000101

一次求反后         11111010

二次求反后         00000101


在上述操作中,经过连续的两次求反后,又恢复了原来的初始值,因此第一次求反可加密,第二次求反可用于解密。
代码如下:
在这里插入图片描述

5、按位左移(<<)

假设一个常量x,左移n位,则按位左移表示把x的每一位向左平移n位,右边空位补0。例如,15及其左移一位、二位、三位的二进制代码如下:


初始字节内容    00001111    对应十进制值为15

左移一位后的字节内容    00011110    对应十进制值为30

左移二位后的字节内容    00001111    对应十进制值为60

左移三位后的字节内容    01111000    对应十进制值为120



可以这样记,n为多少,从左往右就去掉多少位,在最右边补相应个数的0即可。
代码如下:
在这里插入图片描述

6、按位右移(>>)

假设一个常量x,右移n位,x >> n则表示把x的每一位向右平移n位。当x为有符号数时,左边空位补符号位上的值(即负数补1),这种一位移位称为算术移位;当x为无符号数时,左边空位补0(即正数补0),这种移位称为逻辑移位。下面我们举两个例子:
1、15按位右移一位,二位,三位的结果如下:


初始字节内容    00001111    对应十进制值为15

左移一位后的字节内容    00000111    对应十进制值为7

左移二位后的字节内容    00000011    对应十进制值为3

左移三位后的字节内容    00000001    对应十进制值为1



代码如下:
在这里插入图片描述
再如,-15按位右移一位,二位,三位的结果如下:


初始字节内容    11110001    对应十进制值为-15

左移一位后的字节内容    11111000    对应十进制值为-8

左移二位后的字节内容    11111100    对应十进制值为-4

左移三位后的字节内容    11111110    对应十进制值为-2



代码如下:
在这里插入图片描述
**总结:**在实际运用中,通常用左移位和右移位来代替整数的乘法和除法,以便于将软件算法用硬件实现。其中,每左移一位相当于乘以2,左移n位相当于乘以2的n次方。每右移一位相当于除以2,右移n位相当于除以2的n次方。这种运算在某些场合下是非常有用的。例如,在实现某些含有乘除法的算法时,可以通过移位运算实现乘2或除2运算,这样非常有利于算法的硬件实现。

以上就为大家总结了C语言位运算符的计算方法,虽然容易混淆,但是下去多练,多操作就会很快记住啦!如果大家在读完这篇博客后有所帮助,请给我点个赞关注一下吧!谢谢大家了。如果有什么问题,可以在下方评论,或者加我QQ:1423759736,我会及时回复的!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185783.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java栈帧里面的储存的内容_java创建一个栈

    java栈帧里面的储存的内容_java创建一个栈文章转载自:http://www.tuicool.com/articles/URZrMnbjvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。栈帧(StackFrame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(VirtualMachineStack)的栈元素。栈帧存储了方法的…

  • pycharm 风格_python主题更改

    pycharm 风格_python主题更改pycharm版本:2020.1.2Professional主题插件:MaterialThemeUI、AtomMaterialIcons效果插件下载方法IDE在Preference中找到Plugins一项,在插件商场中输入插件名并安装一开始用这种方法但是下载一半就fail了,所以转到官网下载官网下载MaterialThemeUIgithub地址MaterialThemeUI插件官网地址在插件官网中选择pycharmprofessional和相应的版本这里.

  • 浮雕建模软件_自建房设计软件

    浮雕建模软件_自建房设计软件vectricaspire10是一款非常专业的3d浮雕模型设计软件,为CNC铣床上创建和切割零件提供了强大直观的解决方案,凭借其独特的3D组件建模、完善的2D设计、编辑工具集让你可以轻松使用现有2D数据或导入的3D模型,甚至能够从头开始创建自己的2D和3D零件。而且可以将几何体捕捉到不作为几何体存在的直线,延伸和交叉点,从而减少对大多数构造矢量的需求,还具有一整套完善的绘图工具,允许你通过在创建几何体时允许键入值来更轻松地为形状创建和编辑过程添加更多精度,让你能够更准确地切割这些形状。与此同时,全新的v

  • ideal 2022 激活码【2022免费激活】2022.03.01「建议收藏」

    (ideal 2022 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)

    双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)源代码:#include<stdio.h>#include<WINDOWS.H>#defineSEND_BUFF_SIZE1024//实现去除执行结果中的”命令\n”voidprint(char*cmdstr){ while(*((char*)cmdstr++)!=’\n’); printf(cmdstr);}intmai…

  • 数据库的简介与类型

    数据库的简介与类型数据库的简介与类型

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号