那些年玩过的 高逼格进制转换 与 位运算

进制

 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。

首先呢,了解位运算之前,我们要先指定进制之间的转换

众所周知我们生活中所用的使用的数字是十进制数,而计算机所认识的是二进制

所以呢,作为一个程序员我们必须要掌握二进制与十进制之间的互转与运算

二进制中的一些关键字:

1)高位

一串二进制串,左面为高位

2)低位

一串二进制串,右面为低位

3)原码

我们所认识的二进制码,也就是我们进制间转换所得到的值,我们认识,但计算机不认识

4)反码

正数不需要做反码操作,,,负数的反码:符号位不变,0变1,1变0  -------反码是原码转为补码的中间过程

5)补码

计算机所认识并可计算的字节码,正数的补码还是其原码本身,,负数的补码是其反码+1

01.正数的原码,反码,补码都一致

02.java中所有的数字都是有符号的  符号位 正数0  负数1

03.负数的反码=符号位不变+其他位取反(1变0 0变1)

04.负数的补码=反码+1

十进制转二进制

可以明确的说,只要你会加法你就可以秒转

先来一张比较牛逼的表:

1024 512 256 128 64 32 16 8 4 2 1

看不懂?没关系,接下来我们来说

我们随便拿来一个数:765 (为了说明我这个办法确实nb,我们拿了一个比较大一点的数)

我们已经有表了,那么,就套表呗

首先找到765最近的一个比他小的数

在他下面写个1,也就是512

然后依次往后相加,发现相加比765大那么下面写0,然后舍去,只然后加下一个(注意是下面写过1的连续相加)最后可以得出来:

1024

512

256

128

64

32

16

8

4

2

1

1

0

1

1

1

1

1

1

0

1

765的二进制数就是0 1011111101   (最前的0当符号位)

因为是正数所以这既是它的原码也是它的补码

那如果是负数呢?-765

简单,就是拿到其正数的二进制数,改变符号位拿到原码:

1 1011111101 这个值是我们转换的二进制码

然后取反码(0变1,1变0,)

也就是 1(符号位不变)   0100000010   然后补码+1

1 0100000011

-765的补码就是1 0100000011  这个值是计算机可以进行计算解析的二进制码

二进制转十进制

可以明确的说在这里你只要会乘法运算,和明白数组下标就会秒转    或者拿出上面的万能转换表

还是老规矩,随便写一个0和1组成的字符串,然后正负两种情况

符号位为正:

随便一个0符号位的二进制串 (既是原码也是补码)

0 1101 ok,发大招,转换

先忽略符号位,将后面的二进制串我们看成一个倒着的int类型数组,低位为0,依次往做+1

古老算法:

当前数*2的下标次方,然后将所有的数相加

那么这个数就是:

1*2的0次方+1*2的2次方+1*2的3次方=1+4+8= 13

然后加上符号位

那么最终值就是+13

万能表算法:

1024

512

256

128

64

32

16

8

4

2

1

1

1

0

1

那么。。。就是  8 +4 +1=13

完美!!!

符号位为负:

如果拿到的是一个原码,,那就跟上面算法一样,只不过符号位为负的而已

如果拿到一个补码,也就是中间多两部操作

上面说了,原码转补码是 原码取反+1

那么,反推,补码转原码就是。。。补码-1取反

得到原码,再用上面其中一种算法就ok了

位运算

算术右移 >>

符号位不变,低位溢出删除,高位补零!

举个例子:5>>2 (解析:把五的二进制数右移两位)

先算出5 的二进制:

0 101   右移两位,符号位不变

0 00101 低位溢出删除,高位补零!

最后结果:0 001

转回十进制就是1

如果是负数就是先转码然后位移

算术左移 <<

符号位不变,高位溢出删除,低位补零!

举个例子:5<<2 (解析:把五的二进制数右移两位)

先算出5 的二进制:

0   101   左移两位,符号位不变

0 10100 高位溢出删除,低位补零!

最后结果:0 10100

转回十进制就是20

如果是负数就是先转码然后位移

逻辑右移 >>>

又叫无符号右移

不管符号位!低位溢出删除,高位补零!

所以呢,,逻辑右移的其值永远是正数,剩下的跟算术右移大同小异

无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位  无符号右移运算符>>> 只是对32位和64位的值有意义

按位与 &

两位都为1,结果为1

取 5&3

5 二进制:101

3 二进制:011

101

& 011

001

结果为1

按位或 |

两位有一位为1,结果为1

取5|3

5 二进制:101

3 二进制:011

101

| 011

111

结果为:7

按位异或 ^

必须是一位是0,一位是1,结果才为1

取5^3

5 二进制:101

3 二进制:011

101

^ 011

110

结果是:6

按位取反 ~

取~3

3 二进制:0 011

整体取反  1 100

负数。。。补码转原码,原码转十进制

-1取反:011 100

符号位为1,所以最后值:-4

 最后发现,

有个规律:就是数值+1之后取相反的值

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏五分钟学算法

冰与火之歌:「时间」与「空间」复杂度

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,比如排序就有前面的十大经典排序和...

12910
来自专栏数据结构与算法

Berlekamp-Massey算法学习笔记

很久之前就听说过这个算法,当时六校联考的时候Day1T1是一道很有意思的递推,神仙zzx不会做于是就拿BM算法艹出了递推式Orzzzzzzzzzzx

28220
来自专栏五分钟学算法

看动画轻松理解「链表」实现「LRU缓存淘汰算法」

前几节学习了「链表」、「时间与空间复杂度」的概念,本节将结合「循环链表」、「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存...

14320
来自专栏杨熹的专栏

什么是条件随机场 CRF: Conditional Random Fields

Conditional Random Fields 条件随机场,是一种判别模型,可以用于预测序列数据,通过使用过去的上下文信息,使模型达到更好的预测效果。

55230
来自专栏Java架构沉思录

面试重灾区之原子操作你有必要了解下

在JDK1.5+的版本中,Doug Lea和他的团队还为我们提供了一套用于保证线程安全的原子操作。我们都知道在多线程环境下,对于更新对象中的某个属性、更新基本类...

13520
来自专栏量子位

AlphaZero登上《科学》封面:一个算法“通杀”三大棋,完整论文首次发布

不仅会下围棋,还自学成才横扫国际象棋和日本将棋的DeepMind AlphaZero,登上了最新一期《科学》杂志封面。

8020
来自专栏杨熹的专栏

白话什么是谱聚类算法

谱聚类(Spectral Clustering, SC), 是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图...

16430
来自专栏编程一生

不够聪明所以选择工程?

曾经听一个面试者说过:因为觉得自己不够聪明所以选择了工程,如果自己足够聪明的话就去做算法了。对于他这段话我思考的很久,最后的结论是:Are you kiddin...

8810
来自专栏linux驱动个人学习

LRU算法

内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

42420
来自专栏五分钟学算法

看动画轻松理解时间复杂度(二)

上篇文章讲述了与复杂度有关的大 O 表示法和常见的时间复杂度量级,这篇文章来讲讲另外几种复杂度: 递归算法的时间复杂度(recursive algorithm ...

10540

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励