美文网首页
02Python学习笔记之二.二【进制、原反补码、位运算】201

02Python学习笔记之二.二【进制、原反补码、位运算】201

作者: 平知 | 来源:发表于2019-08-17 08:20 被阅读0次
章节号 内容            
1图片格式(png) 宽度大于620px,保持高宽比减低为620px
1-1 应用
1-1-1 方法

第1章节  进制

  16进制、10进制、8进制、2进制
  计算机只能识别10,最早以此为2进制。但是人难以读0和1,所以需要在人类认识的字符和0与1之间做转换。从而引出16进制、10进制、8进制等进制和字符编码(把人识读的字符转换成0和1组成的数字串)等。
  16进制:1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(15),10(16)

第2章节  原码、反码、补码

  首先我们考虑字符,包括汉字、数字、英文字符、各种语言等等,每一个单个的字符,要先规定到底用几个0或者1来表示,一个0或者一个1设定为一个bit,即一个位;八个0或者1就是8个bit,一个Byte,即一个字节。



  ↑为了表示正负数,把最左边一位定为符号位,0为正,1为负。考虑1加上-1的情况是什么。

0000 0000 0000 0001
#加上
1000 0000 0000 0001

  ↑单纯考虑二进制的情况,发现二进制的1加上-1等于如下:

1000 0000 0000 0010

  ↑字面值等于-2。这明显和实际结果相悖。

  由此引入:反码,补码


  规则:正数:原=反=补

  规则:负数:反=符号位不变,其他位取反
  规则:负数:补=反码+1


#-1原码
1000 0000 0000 0001
#-1反码
1111 1111 1111 1110
#-1补码
1111 1111 1111 1111

  正负数相加改为(两个数的补码相加):

#-1补码
1111 1111 1111 1111
#1补码
0000 0000 0000 0001
#注意这是一个补码的结果,还要再转换回原码才行
0000 0000 0000 0000

  ↑结果其实是有一个进位的,但是这里看这16位就等于0。

  负数的补码转换回原码:

  符号位不变,取反,加1(和原码变补码过程相同)

#-1补码
1111 1111 1111 1111
#-1原码计算过程
1000 0000 0000 0000
+
0000 0000 0000 0001
=
1000 0000 0000 0001

  ↑正好等于-1

第3章节  进制转换

In [92]: bin(18)
Out[92]: '0b10010'

In [93]: bin(-18)
Out[93]: '-0b10010'

  ↑0b表示是二进制

In [94]: hex(18)
Out[94]: '0x12'

In [95]: hex(-18)
Out[95]: '-0x12'

  ↑0x表示是十六进制

In [97]: oct(18)
Out[97]: '022'

In [98]: oct(-18)
Out[98]: '-022'

  ↑python2的八进制

In [1]: oct(18)
Out[1]: '0o22'

In [2]: oct(-18)
Out[2]: '-0o22'

  ↑python3的八进制

In [3]: int(-0o22)
Out[3]: -18

In [4]: int(-0x12)
Out[4]: -18

In [5]: int(-0b10010)
Out[5]: -18

In [6]: int("0x12",16)
Out[6]: 18

第4章节  位运算

#5
0000 0000 0000 0101
#左移一位,得10
0000 0000 0000 1010
#再左移一位,得20
0000 0000 0001 0100

  ↑结论:左移一位,等于乘以2。快速完成这种乘法,可以用位运算进行
  ↑结论:右移一位,等于除以2。快速完成这种除法,可以用位运算进行


  运算符:
  1、& 按位与
  2、| 按位或
  3、^ 按位异或

#如果a、b两个位不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
In [24]: 0b1100^0b0001
Out[24]: 13

  4、~ 按位取反

In [19]: ~2
Out[19]: -3

  5、<< 按位左移
  6、>> 按位右移

In [12]: 5<<1
Out[12]: 10

In [13]: 8>>2
Out[13]: 2

  取反运算的特殊性(原因是:在计算机系统中,数值都是以补码来表示和存储的)

In [31]: bin(~9)
Out[31]: '-0b1010'

In [32]: bin(~0b1001)
Out[32]: '-0b1010'

  首先,9是正数,原反补相同。

0000 1001
取反
1111 0110
这就是9的补码的取反

接下来,要转换成我们认识的数字。python中数都是分正负的,所以的一位符号位固定保留的,
这里系统会判定为这是个负数,所以第一位不变。
`符号位不变,其他位取反,再加一,变会原码`
10001001
加1
10001010

  ↑最后结果为:-10
  ↓下面再类推一个-9的取反等于几?

In [33]: ~-9
Out[33]: 8

In [34]: bin(~(-0b1001))
Out[34]: '0b1000'

In [35]: ~(-0b1001)
Out[35]: 8

相关文章

  • 02Python学习笔记之二.二【进制、原反补码、位运算】201

    第1章节  进制   16进制、10进制、8进制、2进制  计算机只能识别1和0,最早以此为2进制。但是人难以读0...

  • Python基础之位运算符(含原码反码补码的通俗解释)

    目录 1 二进制 2 原码、反码、补码 3 位运算符 4 位运算符使用技巧 上回学习运算符时,漏了位运算符,因为位...

  • 2018-11-27 (Review-1)

    一 (进制转换, 补码反码, 字符基础, 位运算) 1.进制的转换二进制bin(整数)八进制oct(整数)十六进制...

  • 位运算

    位运算 位运算是指对数据二进制位进行运算 按位与& 按位或| 按位异或^ 非~ 原码、反码、补码 按位与& 都为1...

  • byte类型最大值和最小值-128~127

    先了解二进制运算的几个概念 正数的反码和补码都是自己负数的反码:符号位除外,其他位取反负数的补码:其反码末位+1 ...

  • C语言01 -- 运算符

    位运算符 位运算符只作用于整型与字符型的二进制位;位运算都是针对数据的补码进行处理的.位运算符主要分为以下6类: ...

  • 第06天C语言(00):笔记总结

    01-进制转换-基本概念 02-进制转换 03-原码补码反码 04-位运算 05-左移右移 06-位运算-练习1 ...

  • C:按位与、按位或、按位异或运算

    一、按位与 & 1.概念:参加运算的两个对象,按二进制位进行“与”运算,负数按补码形式参加按位与运算。2.规则 3...

  • 数值是以补码表示的

    正数的补码与原补码相同 负数的补码:将该数的绝对值的二进制数按位取反后再加1 例如:求-10的补码 10的原码: ...

  • 二进制中1的位数——jzoffer

    位运算是把数字用二进制表示之后,对每一位上0或者1的运算。 负数的存储 十进制负数是以其补码存储在内存上的。验证:...

网友评论

      本文标题:02Python学习笔记之二.二【进制、原反补码、位运算】201

      本文链接:https://www.haomeiwen.com/subject/vyqhsctx.html