目录
一、操作符的分类
二、二进制和进制转换
但我们该怎么完成常用进制之间的进制转换呢?
如何完成十进制到二进制
编辑如何完成二进制转到八进制
如何完成二进制转到十六进制
如何完成其他进制的转换
前言
C语言中提供了非常丰富的操作符
一、操作符的分类
一些简单的操作符比如:算术操作符,赋值操作符,关系操作符,逻辑操作符,相信大家都已了解,本文重点在于有关二进制的移位操作符和位操作符,还有部分单目操作符(sizeof,~
二、二进制和进制转换
因为本文要讲的移位操作符和位操作符,部分单目操作符(~,&)都用到了二进制的知识,所以我们先讲一个明白进制转换的问题:
常见的有二进制,八进制,十六进制
那我们生活中常见的十进制举例子:每一位上的数字范围是0~9,比9大之后需要在下一位进1,
所以我们可知二进制的数字范围是0~1,显而易见,八进制,十六进制就以此类推了。
依据权重将二进制转为十进制最为简单
但我们该怎么完成常用进制之间的进制转换呢?
如何完成十进制到二进制
一些比较小的数我们可以直接凑,但较大的数字在凑的话会很麻烦
所以我们可以用这种整除的方法(类似于小学学的求最大公约数)
![]()
如何完成二进制与八进制的互相转化
八进制的每位数是0~7,而二进制111对应的数就是7,所以每三个2进制的都可以对应为一个八进制,剩余不够的直接换算
还有一种说法就是2的三次方是8,二进制每一位的权重的三次方是对应八进制每一位的权重,所以三个二进制转换为一个八进制
二进制转换为八进制需要每三个数算,反之八进制将每位数拆成三个二进制
在八进制数字前面加上0,编译器会将其识别为八进制
如何完成二进制转十六进制的互相转化
十六进制的每一位数字则是0~9,a~f,将最大的数写成二进制,最多四位二进制就足够了。
所以一位十六进制就可以用四个二进制替换
16进制表示时前面加一个0x
如何完成其他进制的转换
我们学会了二进制所有的转换,十进制,八进制,十六进制之间转换,则需要换成二进制后转换
三、原码、反码、补码
整数二进制表示形式有三种:原码,反码,补码
整数分为:有符号整数,无符号整数(正数,负数)
有符号整数的三种表示方法分为:符号位和数值位两个部分,最高的一位被当作符号位
“0”代表正,“1”代表负
正整数原码,反码,补码相同 负整数的原码,反码,补码不同
无符号整数原码,反码,补码相同
原码:直接将数值翻译成二进制的数字
反码: 将原码翻译对应的每一位二进制数字都按位取反
补码:反码加一得到补码
补码取反再加一也可得到原码(常用)跳过
对于整形数据来说,数据存储,计算,表示都是用的补码,因为补码可以将符号位和数值域统一处理,加法和减法统一处理(CPU有只有加法器),并且原码和补码的相互转换的过程是相同的,都是可以通过取反加一得到,因此不需要额外的电路
四、移位操作符
<< 左移操作符
>> 右移操作符
注:操作数只能是整数,移动的是二进制的位
1.左移操作符
#include<stdio.h> int main() { int a = -10; //1000000000000000000000001010 -10原码 //1111111111111111111111110101 反码 注意符号位不变 //1111111111111111111111110110 补码 int b = a << 1 ; //1111111111111111111111101100 b的补码 //1000000000000000000000010100 b的原码 左边抛弃,右边补0 printf("a = %d",a); // -10 printf("b = %d",b); // -20 左移相当于乘上2 return 0; }2.右移操作符
(1)逻辑右移:左边用0补充,右边丢弃
(2)算术右移:左边与原符号位相同,右边抛弃
使用哪一种取决于编译器的实现,我们常用的编译器都是算术右移
int main() { int a = -10; //1000000000000000000000001010 -10原码 //1111111111111111111111110101 反码 注意符号位不变 //1111111111111111111111110110 补码 int b = a >> 1 ; //1111111111111111111111111011 b的补码 //1000000000000000000000000101 b的原码 左边与原符号位相同,右边补0 printf("a = %d",a); // -10 printf("b = %d",b); // -5 右移相当于除上2 return 0; }五、位操作符
1.基础概念
1. & //按位与
2. | //按位或
3. ^ //按位异或
4. ~ //按位取反
int main() { int a = 10; //000000000000000000000001010 a的原,反,补 int b = -7; //100000000000000000000000111 //111111111111111111111111001 b的补码 int c = a & b;//只要有0则为0,同时为1则为1 //000000000000000000000001010 //111111111111111111111111001 //000000000000000000000001000 c的原,反,补码 printf("%d\n", c);//8 int d = a | b ;//有1则为1,同时为0则为0 //000000000000000000000001010 //111111111111111111111111001 //111111111111111111111111011 d的补码 //100000000000000000000000101 d的原码 printf("%d\n", d);//-5 int e = a ^ b; // 按位异或 x相同为0; 相异为1 }4.按位取反
int main(){ int a = 0; //000000000000000000000000000000 0的补码 printf("%d" , ~a); //111111111111111111111111111111 按位取反 //100000000000000000000000000001 }注:与原码到反码不同,符号位也需取反