数据结构与算法入门之二进制与逻辑运算篇

数据结构与算法入门之二进制与逻辑运算篇本文会介绍二进制的入门到使用,内容中会讲解二进制,八进制,十进制,十六进制相互转换等,让你熟练使用二进制。 会讲解到二进制中的源码,反码,补码等内容。 会详细讲解二进制中的逻辑运算符的使用,比如与(&),或(|),取反(~),异或(^),左移(<<…

一,简介

  1. 本文会介绍二进制的入门到使用,内容中会讲解二进制,八进制,十进制,十六进制相互转换等,让你熟练使用二进制。
  2. 会讲解到二进制中的源码,反码,补码等内容。
  3. 会详细讲解二进制中的逻辑运算符的使用,比如与(&),或(|),取反(~),异或(^),左移(<<),右移(>>),无符号右移(>>>)。
  4. 扩展篇:当你学完以上二进制后,你会明白为什么java中int类型中默认取值范围是为啥是-128 到 127。

二,进制转换

先从十进制切入,因为十进制是我们生活中最常见的数字

1.十进制转二进制第一种方法:短除法

  • 比如十进制数字114使用短除法后的二进制为:1110010
  • 短除法算二进制就是除2取余,最后右边余数从下往上取,最后得到就是二进制数
  • 同理,要得到8进制,16进制就除8或16取余就行 数据结构与算法入门之二进制与逻辑运算篇

2. 第二种算法,直接算2的倍数

  • 116=64+32+16+4 最后结果是: 01110100
  • 算法技巧:先从2的倍数最大值算,比如116中2的最大整数倍是64,因为再往上算128就大于64了,所以只能算到64,然后再往2除就是32,以此类推,到4为止,刚好是:64+32+16+4=116
  • 当得到64+32+16+4这样的数字后,再转二进制一目了然了,只要把对应的数字转二进制就得到了结果 01110100

3. 二进制转10进制

技巧:只要从右往左算2的幂次方相加就行,幂次方值取依次从右向左数下标就行,小下标从零开始

  • 01110100 转十进制算法:数据结构与算法入门之二进制与逻辑运算篇最后相加得到是116

其它进制转换类似,比如8进制转10进制,就以8为底数,下标为幂次方,然后乘以当前数字,(其实二进制也要乘以数字的,因为二进制有数字的都是1,上面把乘1省去了)16进制同理,比如:

4. 八进制转十进制:比如八进制47转十进制

数据结构与算法入门之二进制与逻辑运算篇

5. 十六进制转10进制

十六进制数值之母代表值,如下图: 数据结构与算法入门之二进制与逻辑运算篇 十六进制 0xAF 转10进制 如下图: 数据结构与算法入门之二进制与逻辑运算篇

三,源码,反码,补码

比如数字 7
源码:00000111
反码(源码的基础上取反):11111000
补码(在取反基础上加1): 11111001
图解如下图: 数据结构与算法入门之二进制与逻辑运算篇

1. 二进制中最左边带符号的高位如果是0则是正数,是1则是负数

  • 负数用补码表示,10进制的负数转二进制,先求对应的正数,然后符号位定位1,其余位取反+1
  • 比如负数二进制:11000100 首先左边第一位是符文位代表负数,所以变成0,取反后变成:00111011,然后加1,最后变成00111100 ,然后把次结果转十进制为60,说明负原二进制为-60
2. 无符号数和有符号数的范围区别。

无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:

  • 无符号数: 11111111 值:255
    1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20
  • 有符号数: 01111111 值:127
    1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20
  • 同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。
  • 不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:
    无符号数: 0 —————– 255
    有符号数: -128 ——— 0 ———- 127
  • 同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。

四,逻辑运算符

1. 与 &

  • 遇0则0,遇1则1
  • 比如:1&1=1,1&0=0,0&0=1

2. 或 |

  • 遇1则1
  • 比如:1|1=1,1|0=1,0&0=1

3. 取反 ~

  • 0取反1 ,1取反0

4. 异或 ^

  • 不进位加
  • 相同为0,相异为1
  • 比如:1^0=1,0^1=1,1^1=0,0^0=0

5. 右移 >>

  • 右移补符号位,如果符号位为0则补0,为1则补1
  • 比如:01001001 右移后变成 00100100
  • 比如8的二进制 00001000 右移后:00000100
  • 正整数向右移相当于除以2,向左移相当于乘以2

6. 左移 <<

  • 左移右边永远补0
  • 比如:01001001 左移后:10010010
  • 比如 0010 左移后 0100

7. 无符号右移>>>

  • 右移补符号位,符号位永远补0
  • 比如:01001001 右移后变成 00100100
  • 符号位是二进制中最左边的那位数

五,java中int类型中默认数值范围为什么是-128 到 127

java byte 是-128 到 127,一个byte占用8个字节

  • byte类型 占1个字节也就是8位二进制数(最大值1111 1111),2^8=256个数字,二进制从0开始,也就是表示 0-255 这256个数。

  • 计算机用的是二进制反码,最高位为符号位 所以正数 111 1111 这7个1位最大值,2^7 也就是128,同上二进制从0开始,正数范围表示的是 0 到 127 这128个数。
    所以负数 1111 1111 这8个1位最小值,(去掉最高位符号位)2^7 也就是128,从-1开始(0在上面已经有表示了哦,
    所以这里-1开始),负数数范围表示的是 -1 到 -128 这128个数。
    综合一下,byte 范围就是 -128 到 127 这256个数

今天的文章数据结构与算法入门之二进制与逻辑运算篇分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20378.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注