当前位置: 首页 > news >正文

【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制
在这里插入图片描述

目录

  • 一、进制之间的转化
    • 1、什么是二进制,八进制,十进制,十六进制
    • 2、进制之间的转化
      • 其他进制转化为十进制
      • 十进制转化为二进制
      • 二进制转化为八进制
      • 八进制转化为二进制
      • 二进制转化为十六进制
      • 十六进制转化为二进制
  • 二、原码、反码和补码
    • 1、原码
    • 2、反码
    • 3、补码
  • 三、操作符
    • 1、位操作符
      • &按位与操作符
      • |按位或操作符
      • ^按位异或操作符
      • ~按位取反操作符
    • 2、移位操作符
      • <<左移操作符
      • >>右移操作符
    • 3、补码储存数据的原因

一、进制之间的转化

1、什么是二进制,八进制,十进制,十六进制

在这里插入图片描述
同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来进制的定义:从右往左一次用各位上的数字乘以这个进制的n次方(n为从右往左以0为首依次++的数字)

2、进制之间的转化

其他进制转化为十进制

如上图所说,将所有数字相加即转化的十进制数

十进制转化为二进制

假设我们将十进制数120转化为二进制数
在这里插入图片描述
得出的结果为1111000
进行转化的方法就是:这个数字%2,得到的余数写在一边,直到最后被除数为0时,再将数字从下往上抄上,这个数字即为十进制数字的二进制数

二进制转化为八进制

二进制----->八进制
1 ---------------> 1
10 --------------> 2
11 --------------> 3
100 ------------> 4
101 ------------> 5
110 ------------> 6
111 ------------> 7
八进制下最大的数字就是7,我们可以用三个二进制数字来表示,也就是说每三个二进制数字就可以表示一个八进制数字
在这里插入图片描述
规则是从右开始每三位数字为一组,转化为其对应的八进制数字,再抄在一起,即为这个二进制数字的八进制大小,不足三个的剩下的为一组(在不足三个的前面添0使其补足三个更容易理解)

八进制转化为二进制

就是将每一位拆开,把每一位数字转化为其对应的二进制数字,最后抄在一起就可以了,即二进制转化为八进制的逆过程

二进制转化为十六进制

二进制转化为十六进制与转化为二进制转化为八进制大同小异,我们举的例子还是上面的那个二进制数字
在这里插入图片描述
二进制----->十六进制
1 ---------------> 1
10 --------------> 2
11 --------------> 3
100 ------------> 4
101 ------------> 5
110 ------------> 6
111 ------------> 7
1000 ----------->8
1001-----------> 9
1010-----------> a
1011-----------> b
1100 ----------->c
1101 ----------->d
1110 ----------->e
1111 ----------->f
四位二进制数就可以表示十六进制下的最大数字f(即十进制下的15)
规则是从右开始每四位数字为一组,转化为其对应的十六进制数字,再抄在一起,即为这个二进制数字的十六进制大小,不足四个的剩下的为一组(在不足四个的前面添0使其补足四个更容易理解)

十六进制转化为二进制

就是将每一位拆开,把每一位数字转化为其对应的四位二进制数字,最后抄在一起就可以了,即二进制转化为十六进制的逆过程

二、原码、反码和补码

原码反码补码是计算机整数的二进制数的表示的三种形式,存储在计算机中的数据是补码
三种表⽰⽅法均有符号位数值位两部分,2进制序列中,最⾼位的1位是被当做符号位(0表示正,1表示负),剩余的都是数值位。
正整数的原反补码都相等,下面主要来说负整数的原反补码
(特别需要说明的是:原码转化成补码可以先反码再+1,补码转化成原码除了-1后再反码也可以先反码再+1)

1、原码

直接将数值按照正负数的形式翻译成⼆进制

2、反码

将原码的符号位不变,其他位依次按位取反

3、补码

反码+1

三、操作符

1、位操作符

&按位与操作符

按位与操作符用于取两个操作数的按位与结果。
规则:只有当两个对应的二进制位都为1时,结果为1;否则结果为0。

#include <stdio.h>
int main()
{int a = 10;int b = 20;int c = a & b;printf("%d", c);return 0;
}

在这里插入图片描述
运行结果为零
我们来分析一下这个代码
在这里插入图片描述
都为1时为1,否则就是0,结果为0
需要注意的是 && 是逻辑操作符,表示逻辑与

当然&也表示取地址操作符

|按位或操作符

按位或操作符用于取两个操作数的按位或结果。
规则:只有当两个对应的二进制位都为0时,结果为0;否则结果为1。

#include <stdio.h>
int main()
{int a = 10;int b = 20;int c = a | b;printf("%d", c);return 0;
}

在这里插入图片描述
运行结果为30
我们来分析一下:都为0则为0,否则为1
在这里插入图片描述
16+8+4+2=30
值得注意的是 || 是逻辑操作符:逻辑或

^按位异或操作符

按位异或操作符用于取两个操作数的按位异或结果
规则:只有当两个对应的二进制位不相同时,结果为1;否则结果为0。

#include <stdio.h>
int main()
{int a = 10;int b = 20;int c = a ^ b;printf("%d", c);return 0;
}

在这里插入图片描述
运行结果为30
分析:
在这里插入图片描述
相同为0,不同为1
16+8+4+2=30

~按位取反操作符

按位取反操作符用于对操作数的每个二进制位取反,即将1变为0,0变为1

#include <stdio.h>
int main()
{int a = 10;int b = ~a;printf("%d\n", a);printf("%d\n", b);return 0;
}

在这里插入图片描述
得出b的结果为-11,并且通过观察发现~按位取反操作符不会改变被使用量的大小
分析:

在这里插入图片描述
我们在文章到此之前的内容中所使用的例子都是正整数的例子,其原反补码相同,其实计算机的数据计算是通过补码来进行的,将补码进行运算后再转化成原码
在这里得到的结果为-(8+2+1)= -11

2、移位操作符

操作数只能为整数

<<左移操作符

移位规则:左边抛弃、右边补0

#include <stdio.h>
int main()
{int a = 10;int b = a << 1;printf("%d\n", a);printf("%d\n", b);return 0;
}

在这里插入图片描述
通过观察我们发现,移位操作符也不会改变被操作数的大小
分析:
在这里插入图片描述
得到b的结果20
是负数时表示符号的1也将被左移取消掉

>>右移操作符

分为逻辑右移和算数右移
两种右移方式取决于编译器
逻辑右移:右边丢一位,左边补0
算数右移:右边丢一位,左边正数补0,负数补1
并且

int num = 10;
num>>-1;//error

是错误的,不管往哪移动,都是不能移动负数位的,左移就用<<,右移就用>>。不存在>>-1等价于<<1的说法

3、补码储存数据的原因

最后我们来说一下为什么计算机中要用补码来储存数据
计算机是一种只会加法的“笨蛋机器”,1-1=1+(-1),将减法转化为加法才能计算,若使用原码储存

在这里插入图片描述
两者相加为2,很显然是错误的
若是我们用补码进行计算
在这里插入图片描述
相加结果是33bit大小的,int只取32bit,把最左边的1给丢掉了
当然这个相加结果也是补码,最后要转化成原码,当然原码的结果是0

c语言的学习可真是任重道远啊,坚持住铁铁们

相关文章:

  • Leetcode刷题笔记题解(C++):203. 移除链表元素
  • Spring Boot项目中TaskDecorator的应用实践
  • 第六十四天 服务攻防-框架安全CVE复现Apache shiroApache Solr
  • 如何使用Coded UI Test对Webpage进行自动化测试
  • FlashMeeting(基于FFmpeg+openCV)视频语音通讯系统
  • Java 爬虫 jvppeteer
  • 美易平台:全球金融市场一周前瞻G20会议至美联储纪要,关键事件点评
  • 【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——自我介绍(英文)
  • .net 微服务 服务保护 自动重试 Polly
  • Java 面向对象进阶 10 多态中调用成员的特点(黑马)
  • 代码随想录刷题第38天
  • Docker中如何删除某个镜像
  • 【微服务生态】Docker
  • 洛谷 P3879 阅读理解
  • 重学Java 18.学生管理系统项目
  • [译] React v16.8: 含有Hooks的版本
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 07.Android之多媒体问题
  • css系列之关于字体的事
  • Fabric架构演变之路
  • golang中接口赋值与方法集
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript对象详解
  • js操作时间(持续更新)
  • Less 日常用法
  • Linux快速复制或删除大量小文件
  • Lsb图片隐写
  • python学习笔记-类对象的信息
  • react 代码优化(一) ——事件处理
  • Spring-boot 启动时碰到的错误
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 翻译:Hystrix - How To Use
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 简析gRPC client 连接管理
  • 将回调地狱按在地上摩擦的Promise
  • 讲清楚之javascript作用域
  • 免费小说阅读小程序
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何选择开源的机器学习框架?
  • 三栏布局总结
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 通信类
  • 项目管理碎碎念系列之一:干系人管理
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $().each和$.each的区别
  • (3)选择元素——(17)练习(Exercises)
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)