当前位置:网站首页>深入理解位运算
深入理解位运算
2022-06-27 13:09:00 【楼下安同学】

什么是进制
进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的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
至此,位运算已经说明完毕。我们可以发现位运算的作用真的就只是在做标记而已,是名副其实的按位运算。
边栏推荐
- Esp32s3 iperf routine test esp32s3 throughput test
- 爱可可AI前沿推介(6.27)
- Principle of printf indefinite length parameter
- Vs debugging skills
- Pre training weekly issue 51: reconstruction pre training, zero sample automatic fine tuning, one click call opt
- jvm 参数设置与分析
- Airbnb复盘微服务
- mysql 锁机制与四种隔离级别
- 阿里一个面试题:使用两个线程,交替输出字母和数字
- jvm 性能调优、监控工具 -- jps、jstack、jmap、jhat、jstat、hprof
猜你喜欢

Cesium实现卫星在轨绕行

Airbnb复盘微服务

基于JSP实现医院病历管理系统

Good luck today

万物互联时代到来,锐捷发布场景化无线零漫游方案

【TcaplusDB知识库】TcaplusDB-tcapulogmgr工具介绍(一)

Neo4j: basic introduction (I) installation and use

ACL 2022 | TAMT proposed by Chinese Academy of Sciences: TAMT: search for a portable Bert subnet through downstream task independent mask training

Vs debugging skills

外包2年的我终于上岸了!记录我的字节跳动3轮面试,希望帮助到大家!
随机推荐
Istio微服务治理网格流量管理核心资源控制器详解
hue新建账号报错解决方案
Teach you how to build a permanent personal server!
Openfeign service interface call
Privacy computing fat offline prediction
zabbix支持钉钉报警
夏日里的清凉
ensp云朵配置
基于STM32设计的蓝牙健康管理设备
What else can PLM do?
Hue new account error reporting solution
[weekly replay] the 81st biweekly match of leetcode
Does Xinhua San still have to rely on ICT to realize its 100 billion enterprise dream?
OpenHGNN发布0.3版本
JSON. Stringify usage
ThreadLocal 源码全详解(ThreadLocalMap)
nifi从入门到实战(保姆级教程)——身份认证
What is low code for digital Nova? What is no code
Journal quotidien des questions (6)
爱可可AI前沿推介(6.27)