您现在的位置是:首页 > 学无止境
程序员的数学笔记1--进制转换
转载自:https://mp.weixin.qq.com/s/Sn7V27O77moGCLOpFzEKqg
课程地址:https://time.geekbang.org/column/intro/143
这是第一节课程的学习笔记--有关进制的转换。
二进制
什么是二进制
十进制计数是使用 10 作为基数,例如一个数字:2871,它是十进制表示,也就是
二进制则采用 2 作为基数,它的数位的形式。例如二进制数字110101
,它转换为十进制的表示过程如下:
根据这个思路,八进制(以 8 为基数)和十六进制(以 16 为基数)等计数方法其实也是同样的道理,和十进制的转换也是同样的做法。
利用 Python 代码实现二进制和十进制的转换,如下所示:
# 十进制转二进制的方法:除2取余,逆序排列, https://blog.csdn.net/shirley_sweet/article/details/73896279
def change(n):
result = '0'
if n == 0: # 输入为0的情况
return result
else:
result = change(n // 2) # 调用自身
return result + str(n % 2)
def decimal_to_binary(decimal_val):
'''
十进制转为二进制
:param decimal_val:
:return:
'''
print('transfer %d to binary' % decimal_val)
recursion_result = change(decimal_val)
print('递归实现转换结果:', recursion_result)
def binary_to_decimal_func(val):
'''
按照定义来实现,即 2^n 的形式
:param val: str
:return:
'''
print('original val: ', val)
numbers = len(val)
result = 0
for i in range(numbers):
result += int(val[i]) * pow(2, numbers - i - 1)
return result
def binary_to_decimal(val):
'''
二进制转十进制
:param val:
:return:
'''
decimal2 = binary_to_decimal_func(str(val))
print('第二种转换二进制为十进制:', decimal2)
实际上,Python 有内建函数可以直接实现这几个进制之间的转换,比如bin
、oct
、hex
分别表示将十进制数转换为二进制、八进制和十六进制,而将其他进制转换为十进制,则可以用int(val, base)
函数,只是需要注意输入值val
必须是字符串,然后设置base
参数为当前输入值所用的进制,比如二进制自然是设置base=2
,代码如下所示:
def binary_to_decimal(val):
'''
二进制转十进制
:param val:
:return:
'''
# 第一种方法,内建函数--int(),输入值必须是字符串形式
decimal = int(str(val), 2)
print('二进制数为: 0b%d' % val)
print('二进制转换为十进制为:', decimal)
def decimal_to_other_build_function(dec):
'''
采用内建函数将十进制转换
参考 http://www.runoob.com/python3/python3-conversion-binary-octal-hexadecimal.html
:param dec:
:return:
'''
print("十进制数为:", dec)
print("转换为二进制为:", bin(dec))
print("转换为八进制为:", oct(dec))
print("转换为十六进制为:", hex(dec))
计算机为什么使用二进制?
二进制的数据表达具有抗干扰能力强、可靠性高的优点;
二进制非常适合逻辑运算;
组成计算机系统的逻辑电路通常只有两个状态,即开关的接通和断开。
二进制的位操作
移位操作
二进制左移一位,表示将数字翻倍,即乘以 2 ,但左移需要注意数字溢出的问题,需要考虑当前采用的变量类型位数,比如是int16
类型,即只有 16 位数,那么就要考虑当前数值的位数是否达到 16 位了;
二进制右移一位,则表示将数字除以 2 ,并使用整数商,注意右移分为算术右移和符号右移,这是因为符号位的原因,一般符号位是0,表示该数值为正数;符号位是1,表示该数值是负数。
对于逻辑右移,需要在右移后在左边补上符号位,即正数补 0,负数补 1 ;
对于算术右移,就是保持符号位不动,其余位数右移。
在 Java 语言中,逻辑右移采用>>>
表示,算术右移是>>
表示,但 Python 并没有>>>
运算符实现逻辑右移的操作。
简单的实现左移操作和算术右移操作:
def left_shift(val, n):
'''
左移操作
:param val:
:param n: 移动的位数
:return:
'''
print('二进制数为: 0b%d' % val)
val = int(str(val), 2)
print('十进制数值:', val)
result = val << n
print('left shift %d, result=%s' % (n, result))
result = bin(int(result))
print('left shift {}, result={}'.format(n, result))
def right_shift(val, n):
'''
右移操作
:param val:
:param n:
:return:
'''
print('二进制数为: 0b%d' % val)
val = int(str(val), 2)
print('十进制数值:', val)
math_val = val >> n
print('right shift {}, math_val={}'.format(n, math_val))
result = bin(int(math_val))
print('left shift {}, result={}'.format(n, result))
测试代码如下:
binary_val = 100101
# 输出结果是 0b1001010
left_shift(binary_val, 1)
# 输出结果是 0b10010
right_shift(binary_val, 1)
逻辑操作
或:参与操作的位中只要有一个是 1,最终结果就是 1;
与:参与操作的位必须都是 1,最终结果才是 1, 否则就是 0;
异或:参与操作的位相同,最终结果就是 0, 否则是 1。
代码实现如下:
def logic_operation(val1, val2):
'''
二进制的逻辑运算,与、或、非以及异或操作
:param val1:
:param val2:
:return:
'''
print('orginal val:{},{}'.format(val1, val2))
dec_val1 = int(str(val1), 2)
dec_val2 = int(str(val2), 2)
print('decimal val:{},{}'.format(dec_val1, dec_val2))
and_result = dec_val1 & dec_val2
or_result = dec_val1 | dec_val2
not_result1 = ~dec_val1
not_result2 = ~dec_val2
different_or_result = dec_val1 ^ dec_val2
print('and result:', bin(int(and_result)))
print('or result:', bin(int(or_result)))
print('not result1:', bin(int(not_result1)))
print('not result2:', bin(int(not_result2)))
print('different or result:', bin(int(different_or_result)))
if __name__ == '__main__':
binary_val = 100101
binary_val2 = 110100
logic_operation(binary_val, binary_val2)
测试的两个二进制数值分别是100101
和110100
,输出结果如下,这里非的操作会实现按位取反,对于有符号数,如果是正数就会变为一个负数。
orginal val:100101,110100
decimal val:37,52
and result: 0b100100
or result: 0b110101
not result1: -0b100110
not result2: -0b110101
different or result: 0b10001
上述源代码的地址是:
https://github.com/ccc013/CodesNotes/blob/master/Maths/Binary.py
文章评论
- 登录后评论
点击排行
-
php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中...
-
centos下postgresql的安装与配置
一、安装(以root身份进行)1、检出最新的postgresql的yum配置从ht...
-
Mysql的大小写敏感性
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE...
-
关于URL编码
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding....
-
header中的Cache-control
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的...