当前位置:网站首页>深入理解位运算
深入理解位运算
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
至此,位运算已经说明完毕。我们可以发现位运算的作用真的就只是在做标记而已,是名副其实的按位运算。
边栏推荐
猜你喜欢

gcc编译动态库和静态库
![[dynamic programming] - Knapsack Problem](/img/27/c48284f15e3f80305d7ce7c02d4378.png)
[dynamic programming] - Knapsack Problem

Privacy computing fat offline prediction

浅谈软件研发的复杂性与效能提升之道

Details of istio micro service governance grid traffic management core resource controller

Ali an interview question: use two threads to output letters and numbers alternately

What else can PLM do?

基于STM32设计的蓝牙健康管理设备

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

Airbnb复盘微服务
随机推荐
ensp云朵配置
To understand again is the person in the song
Yuweng information, a well-known information security manufacturer, joined the dragon lizard community to build an open source ecosystem
一道shell脚本的统计题
隐私计算FATE-离线预测
hue新建账号报错解决方案
How to modify a node_ Files in modules
Database Series: MySQL index optimization and performance improvement summary (comprehensive version)
【动态规划】—— 背包问题
阿里一个面试题:使用两个线程,交替输出字母和数字
Using FRP tool to realize intranet penetration
awk 简明教程
同花顺能开户炒股吗?安全吗?
Pyqt, pyside slot functions are executed twice
Read a poem
云原生(三十) | Kubernetes篇之应用商店-Helm
How to close windows defender Security Center
每日刷题记录 (六)
OpenHGNN发布0.3版本
创建Deployment后,无法创建Pod问题处理