深入理解位运算

在这里插入图片描述

什么是进制

​  进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制—X进制,就表示每一位上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

​  所以说运算的本质是什么呢?我觉得是查数。打破固有的思想,我们把每个数字都看成是符号,这样就有意思多了,我们可以写出自己的进制,可以做自己的运算

进制转换

1、其他进制转十进制

从最低位开始,将每个位上的数提取出来,乘以进制的(位数-1)次方,求和

// 2^n 二进制为:1{n个0}    2^n-1 二进制为:{n个1}
二进制转十进制:	1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 11
八进制转十进制:	0123 = 3*8^0 + 2*8^1 + 1*8^2 = 83
十六进制转十进制:	0x34A = 10*16^0 + 4*16^1 + 3*16^2 = 786

2、十进制转其他进制

将该数不断除以要转换的进制,知道商为0为止,然后将得到的余数倒过来

十进制转二进制:	56 = 2^5 + 2^4 + 2^3 = 111000
十进制转八进制:  156 = 0234
十进制转十六进制:  256 = 0x164

3、二进制转其他进制

将二进制数每三位一组(从低位开始组合),转成对应的八进制 十六进制时四位

二进制转八进制: 11 010 101 = 0325
二进制转十六进制: 1101 0101 = 0xD5

4、其他进制转二进制

将八进制/十六进制每一位转换成对应的一个3/4位的二进制数即可

八进制转换成二进制:	0123 = 0 001 010 011 = 1010011
十六进制转换成二进制:	0x156 = 0001 0101 0110 = 101010110

原码、反码、补码

  • 对于有符号数而言:
    • 二进制的最高位是有符号位:0表示正数,1为负数
    • 正数的原码、反码、补码都一样
    • 0的反码、补码都是0
    • 负数的反码 = 它的原码符号位不变,其他位取反
    • 负数的补码 = 它的反码+1
    • 计算机运算的时候,都是以补码的方式运算的
		1                  		     	 -1   
原码 0000 0001						原码 1000 0001
反码 0000 0001						反码 1111 1110
补码 0000 0001						补码 1111 1111

位运算符

运算符 描述 规则
& 按位与 同时为1,结果为1,否则为0
| 按位或 有一个为1,结果为1,否则为0
^ 按位异或 当结果不同时结果为1,否则为0
<< 左移 左移N位就是乘以2的N次方
>> 左移 右移N位就是除以2的N次方

位运算本质

只要是运算,都是补码!!!运算结束需要转换成源码

//        2补码       3补码
2 & 3 = 0000 0010 & 0000 0011 = 0000 0010 = 2
2 | 3 = 0000 0010 | 0000 0011 = 0000 0011 = 3
2 ^ 3 = 0000 0010 ^ 0000 0011 = 0000 0001 = 1

//         -2补码      3补码      结果(补码)   -> 推出原码
-2 & 3 = 1111 1110 & 0000 0011 = 0000010 =  2

// 位移运算符 箭头朝向哪就是向哪个方向移
// 右移:低位溢出符号位不变,并用符号位补溢出的高位
// 左移:符号位不变,低位补0
// 左移n位 = 原值 * 2^n			右移n位 = 原值 / 4
1 >> 2 = 0  
1 << 2 = 0000 0100 = 4 

​  至此,位运算已经说明完毕。我们可以发现位运算的作用真的就只是在做标记而已,是名副其实的按位运算


版权声明:本文为weixin_45394086原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。