进制转换和位操作

313 阅读2分钟

一、进制转换

1. 十进制 and 二进制

1.1 十进制转二进制

十进制数除2取余法

1.2 二进制转十进制

把二进制数按权展开、相加即得十进制数。

2. 二进制 and 八进制

2.1 二进制转八进制

3位二进制数按权展开相加得到1位八进制数。

2.2 八进制转成二进制

八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。

3. 二进制 and 十六进制

3.1 二进制转十六进制

取四合一

3.2 十六进制转二进制

十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。

3. 十进制 and 八进制 and 十六进制

3.1 十进制转八进制或者十六进制

间接法:把十进制转成二进制,然后再由二进制转成八进制或者十六进制。这里不再做图片用法解释。

直接法:把十进制转八进制或者十六进制按照除8或者16取余,直到商为0为止。

3.2 八进制或者十六进制转成十进制

把八进制、十六进制数按权展开、相加即得十进制数。

二、位操作

符号 描述 运算规则
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

三、常见场景

1. 不用加减乘除做加法

class Solution:
    def Add(self, num1, num2):
        sum1 = num1^num2 #异或代表两数相加但不进位,于是 不进位和=真正的和-进位值
        sum2 = (num1&num2)<<1 #进位值
        return sum1 + sum2

2. 不用加减乘除做加法