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

2024-02-26 1161阅读

温馨提示:这篇文章已超过398天没有更新,请注意相关的内容是否还可用!

欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制

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

目录

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

                一、进制之间的转化

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

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

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

                2、进制之间的转化

                其他进制转化为十进制

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

                十进制转化为二进制

                假设我们将十进制数120转化为二进制数

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

                得出的结果为1111000

                进行转化的方法就是:这个数字%2,得到的余数写在一边,直到最后被除数为0时,再将数字从下往上抄上,这个数字即为十进制数字的二进制数

                二进制转化为八进制

                二进制----->八进制

                1 ---------------> 1

                10 --------------> 2

                11 --------------> 3

                100 ------------> 4

                101 ------------> 5

                110 ------------> 6

                111 ------------> 7

                八进制下最大的数字就是7,我们可以用三个二进制数字来表示,也就是说每三个二进制数字就可以表示一个八进制数字

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

                规则是从右开始每三位数字为一组,转化为其对应的八进制数字,再抄在一起,即为这个二进制数字的八进制大小,不足三个的剩下的为一组(在不足三个的前面添0使其补足三个更容易理解)

                八进制转化为二进制

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

                二进制转化为十六进制

                二进制转化为十六进制与转化为二进制转化为八进制大同小异,我们举的例子还是上面的那个二进制数字

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

                二进制----->十六进制

                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 
                int main()
                {
                	int a = 10;
                	int b = 20;
                	int c = a & b;
                	printf("%d", c);
                	return 0;
                }
                

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

                运行结果为零

                我们来分析一下这个代码

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

                都为1时为1,否则就是0,结果为0

                需要注意的是 && 是逻辑操作符,表示逻辑与

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

                |按位或操作符

                按位或操作符用于取两个操作数的按位或结果。

                规则:只有当两个对应的二进制位都为0时,结果为0;否则结果为1。

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

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

                运行结果为30

                我们来分析一下:都为0则为0,否则为1

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

                16+8+4+2=30

                值得注意的是 || 是逻辑操作符:逻辑或

                ^按位异或操作符

                按位异或操作符用于取两个操作数的按位异或结果

                规则:只有当两个对应的二进制位不相同时,结果为1;否则结果为0。

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

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

                运行结果为30

                分析:

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

                相同为0,不同为1

                16+8+4+2=30

                ~按位取反操作符

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

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

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

                得出b的结果为-11,并且通过观察发现~按位取反操作符不会改变被使用量的大小

                分析:

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

                我们在文章到此之前的内容中所使用的例子都是正整数的例子,其原反补码相同,其实计算机的数据计算是通过补码来进行的,将补码进行运算后再转化成原码

                在这里得到的结果为-(8+2+1)= -11

                2、移位操作符

                操作数只能为整数

                int a = 10; int b = a >-1;//error

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]