【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语言的学习可真是任重道远啊,坚持住铁铁们

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三维GIS开发的就业前景

一、前言 三维GIS是一个伪概念,GIS是地理信息系统&#xff0c;三维GIS就是三维地理信息系统&#xff0c;在课本上&#xff0c;专业概念上&#xff0c;也没有这一说法吧&#xff0c;所以三维GIS&#xff0c;就是技术人员造概念拼凑造出来的&#xff0c;本质上就是GIS三维可视化…

【学习笔记】数据结构与算法03:栈与队列

知识出处&#xff1a;Hello算法&#xff1a;https://www.hello-algo.com/. 文章目录 2.2 栈和队列2.2.1 「栈 stack」2.2.1.1 栈的常用操作2.2.1.2 栈的典型应用 2.2.2「队列 queue」2.2.2.1 队列的常用操作2.2.2.2 队列的典型应用 2.2.3 双向队列 「double-ended queue」2.2.3…

2024 Impeller:快速了解 Flutter 的渲染引擎的优势

参考原文 &#xff1a;https://tomicriedel.medium.com/understanding-impeller-a-deep-dive-into-flutters-rendering-engine-ba96db0c9614 最近&#xff0c;在 Flutter 2024 路线规划里明确提出了&#xff0c;今年 Flutter Team 将计划删除 iOS 上的 Skia 的支持&#xff0c;…

java异常处理设计

异常的继承体系 java 中的异常的超类是 java.lang.Throwable(后文省略为 Throwable), 他有俩自类Exception和Error&#xff0c;Error是由jvm管理&#xff0c;我们不需要考虑。 RuntimeException是Exception的子类。 检查异常&#xff08;Checked Exceptions&#xff09;&#…

Sparse ICP的使用(一)

一、代码下载以及修改 下载以及建立项目&#xff1a; 链接&#xff1a;palanglois/icpSparse: Implementation of the sparse icp algorithm (github.com) 如果github进不去&#xff0c;我这里下载好了&#xff1a;Sparseicp源码资源-CSDN文库 下载好了之后&#xff0c;会…

【关于python变量类型学习笔记】

python的变量类型 在创建变量时会在内存中开辟一个空间&#xff0c;变量是存储在内存中的值。 根据变量的数据类型&#xff0c;解释器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 变量可以指定不同的数据类型&#xff0c;这些变量可以存储整数&#xff0c;…

Canvas绘制

Canvas绘制 一、介绍效果图 二、画圆1 写一个页面2 画一个圆&#xff08;点&#xff09;3 效果 三 画直线1 写一个页面2 画直线3 效果 四 用直线连接两个点1 写一个页面2 连线3 效果 五 画随机点1 写一个页面2 随机点3 效果 六 画随机点并连线1 写一个页面2 画点连线3 效果 七 …

项目成本和收益管理,用易趋就够了,项目价值可量化

最近看到一个吐槽贴&#xff0c;项目经理小刘说&#xff0c;“去年很多项目都成功交付了&#xff0c;为啥项目奖金还是这么少呢&#xff1f;一问领导是由于项目的绩效没有达成&#xff0c;尤其是很多项目的成本都超支了。”总结来说&#xff0c;这主要是由于没有达成项目预期的…

理论学习-ARM-内核

ARM内核 函数的调用加载、存储计算中断异常线程的切换 为了提高学习效率&#xff0c;我们要提前想好学习策略。 首先&#xff0c;使用频率越高的知识点&#xff0c;越要首先学习。假使&#xff0c;我们学习了一个知识点&#xff0c;能覆盖工作中80%的工作量&#xff0c;那是不是…

MySQL数据库进阶第三篇(MySQL性能优化)

文章目录 一、插入数据优化二、主键优化三、order by优化四、group by优化五、limit优化六、count优化七、update优化&#xff08;避免行锁升级为表锁&#xff09; 这篇博客详细探讨了MySQL数据库的多项优化技巧。包括如何进行数据插入优化&#xff0c;采用批量插入和MySQL的lo…

四非保研之旅

大家好&#xff0c;我是工藤学编程&#xff0c;虽有万分感概&#xff0c;但是话不多说&#xff0c;先直接进入正题&#xff0c;抒情环节最后再说&#xff0c;哈哈哈 写在开头 我的分享是来给大家涨信心的&#xff0c;网上的大佬们都太强了&#xff0c;大家拿我涨涨信心&#…

在linux环境如何使用Anaconda安装指定的python版本

首先我们可以查看一下服务器现有的环境 conda info --envs 发现没有我需要的版本&#xff0c;那么可以用如下命令 conda create --name py36 python3.6 我这里安装了python 3.6的版本 再次输入 conda info --envs 可以通过以下命令激活刚刚创建的环境 conda activate py36…

Docker中如何删除某个镜像

1. 停止使用镜像的容器 首先&#xff0c;您需要停止所有正在使用该镜像的容器。您可以使用 docker stop 命令来停止容器&#xff1a; docker stop 11184993a106如果有多个容器使用该镜像&#xff0c;您需要对每个容器都执行停止命令。您可以通过 docker ps -a | grep core-ba…

C语言------------指针笔试题目深度剖析

1. #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 首先要明白这个强制类型转换&#xff0c;即int(*)[5]类型转换成int(*)类型&#xff1b; *&#xff…

联发科将展示6G环境运算和次世代卫星宽带 | 百能云芯

联发科技术有限公司&#xff08;MediaTek&#xff09;近日宣布&#xff0c;将在2024年世界移动通信大会&#xff08;MWC&#xff09;上展示其在移动通信技术领域的最新成就&#xff0c;包括6G环境运算、Pre-6G卫星宽带以及智能手机生成式人工智能&#xff08;AI&#xff09;应用…

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

C++学习Day08之类模板中的成员函数分文件编写问题及解决

目录 一、程序及输出1.1 .h文件cpp1.2 包含hpp 二、分析与总结 一、程序及输出 1.1 .h文件cpp person.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;template<class T1, class T2> class Person { public:Person(T1…

判断一个dll/exe是32位还是64位

通过记事本判断&#xff08;可判断C或者C#&#xff09; 64位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第一个PE&#xff0c;如果后面是d?则为64位 32位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第…

三防加固平板在房地产行业的应用|亿道三防onerugged

近期&#xff0c;有一款引人注目的解决方案——亿道三防onerugged平板电脑&#xff0c;它以其出色的性能和多功能的设计&#xff0c;为房地产行业带来了全新的应用体验。 首先&#xff0c;亿道三防onerugged平板电脑的NFC功能在小区业主身份验证中发挥着重要作用。传统的身份验…

Excel SUMPRODUCT函数用法(乘积求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数&#xff0c;可以实现sum,count等函数的功能&#xff0c;也可以实现一些基础函数无法直接实现的功能&#xff0c;常用来进行分类汇总&#xff0c;分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…