进制转换

进制之间的转换

二进制,计算机中处理数据,存储的方式,逢2进1,由0,1构成

  • 其他进制到十进制的转换
  • 规律:系数*进制数(原进制)^n次方之和

十进制到十进制

十进制:12345 十进制:12345
12345 = 10000 + 2000 + 300 + 40 + 5
= 110^4 + 2103 + 310^2 + 410^1 + 510^0
= 10000 + 2000 + 300 + 40 + 5
= 12345

规律:系数*进制数^n次方之和

二进制: 01010100 十进制:
01010100 = 12^6 + 12^4 + 1*2^2
= 64 + 16 + 4
= 84

  • 十进制到其他进制的转换

  • 除基(目标进制)取余,直到商为0,余数反转
    十进制:84 二进制:01010100
    84/2 = 42 --- 0
    42/2 = 21 --- 0
    21/2 = 10 --- 1
    10/2 = 5 --- 0
    5/2 = 2 --- 1
    2/2 = 1 --- 0
    1/2 = 0 --- 1

  • 其他进制之间的转换

  • 利用十进制作为桥梁进行转换

  • 二进制转八进制,十六进制 拆分组合法 01010100

  • 2进制转8进制 :从右向左,每三位一组,高位不够,用0补齐,算每一组的十进制的值,组合 124

  • 2进制转16进制 :从右向左,每四位一组,高位不够,用0补齐,算每一组的十进制的值,组合 54

  • 针对二进制和十进制之间的转换,人们提供了一个快速转换的方法,8421码

原码,反码,补码 (二进制形式)

由两个部分构成:符号位(最高位),数值位
=======================

  • 原码:正数的原码与其二进制相同,最高位为0,负数的原码最高位为1

3的原码:
1、3的二进制:11
2、3的原码:00000011

-3的原码:
1、3的二进制:11
2、-3的原码:10000011

  • 反码:正数的反码与原码一致,负数的反码,符号位不变,数值位按位取反
    3的反码:
    1、3的二进制:11
    2、3的原码:00000011
    3、3的反码:00000011

-3的原码:
1、3的二进制:11
2、-3的原码:10000011
3、-3的反码:11111100

  • 补码:正数的补码与原码一致,负数的补码,由反码的末位(最右边的)+1

3的反码:
1、3的二进制:11
2、3的原码:00000011
3、3的反码:00000011
4、3的补码:00000011

-3的原码:
1、3的二进制:11
2、-3的原码:10000011
3、-3的反码:11111100
4、-3的补码:11111101

-3+1 = -2
我们看到的结果是底层补码计算后,转成原码,数值位再转10进制,拼接符号位的结果
-3的补码:11111101
1的补码: 00000001

补码: 11111110

已知补码求原码:
符号位 数值位
补码: 1 1111110
反码: 1 1111101
原码: 1 0000010

===> -2

  • & 有0则0
    python
    a1 = 3
    b1 = 4
    '''
    a1的二进制表现形式:

'''
print(a1 & b1) # 0

3的补码:00000011
4的补码:00000100

    00000000

=========================

  • | 有1则1
a1 = 3
b1 = 4
'''
a1的二进制表现形式:

''' 
print(a1 | b1)  # 7

3的补码:00000011
4的补码:00000100
----------------
        00000111
=======================

- ^ 相同则0 ,不同则1
python
a1 = 3
b1 = 4
'''
a1的二进制表现形式:

''' 
print(a1 ^ b1)  #  7

3的补码:00000011
4的补码:00000100
----------------
        00000111
=======================

- ~  针对一个值来说,每一位上进行取反,0变成1,1变成0
a1 = 3
'''
a1的二进制表现形式:

''' 
print(~a1)  #  -4

3的补 码:00000011
----------------
补码:   11111100
反码:   11111011
原码:   10000100
---------------------
         -4
=======================

- <<  补码整体向左移动若干位,右边空出的位置使用0补齐  左移n位实际上就是*2的n次方
a1 = 3 
print(a1<<2)   # 3*4=12  -->  3*2^2 = 12
3的补码:
    00000011
(00)00001100
---------------

b1 = -4
print(b1<<2)  # -4*4 = -16 --> -4*2^2= = -16
-4的原码:10000100
-4的反码:11111011
-4的补码:11111100

    11111100
(11)11110000
-------------------
补码:11110000
反码:11101111
原码:10010000
-------------------
     -16

c1 = 8
print(c1<<2)  # 32
=======================

- 右移>> 左边空出的位置,原本最高位是0,就用0补齐,原本最高位是1,就用1补齐  左移n位实际上就是//2的n次方
python
print(64 >> 2)  # 16
64的补码:01000000
01000000
00010000(00)
---------------------
:16

print(-64 >> 2)  # -16
-64的原码:11000000
-64的反码:10111111
-64的补码:11000000
-----------------------
11000000
11110000(00)
-----------------------
补码:11110000
反码:11101111
原码:10010000
-----------------------
:-16
posted @ 2024-01-17 20:13  peculiar-  阅读(331)  评论(0)    收藏  举报