程序员的数学笔记1--进制转换
最近在学习极客时间的课程–程序员的数学基础课。
课程地址:https://time.geekbang.org/column/intro/143
这是第一节课程的学习笔记–有关进制的转换。
二进制
什么是二进制
十进制计数是使用 10 作为基数,例如一个数字:2871,它是十进制表示,也就是
2871=2×1000+8×100+7×10+1=2×103+8×102+7×101+1×1002871 = 2×1000+8×100+7×10+1=2×10^3+8×10^2+7×10^1+1×10^0 2871=2×1000+8×100+7×10+1=2×103+8×102+7×101+1×100
二进制则采用 2 作为基数,它的数位是2n2^n2n的形式。例如二进制数字110101
,它转换为十进制的表示过程如下:
1×25+1×24+0×23+1×22+0×21+1×20=32+16+0+4+0+1=531×2^5+1×2^4+0×2^3+1×2^2+0×2^1+1×2^0 = 32 + 16+0+4+0+1=53 1×25+1×24+0×23+1×22+0×21+1×20=32+16+0+4+0+1=53
根据这个思路,八进制(以 8 为基数)和十六进制(以 16 为基数)等计数方法其实也是同样的道理,和十进制的转换也是同样的做法。
利用 Python 代码实现二进制和十进制的转换,如下所示:
# 十进制转二进制的方法:除2取余,逆序排列, https://blog.csdn.net/shirley_sweet/article/details/73896279
def change(n):result = '0'if n == 0: # 输入为0的情况return resultelse: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 = 0for i in range(numbers):result += int(val[i]) * pow(2, numbers - i - 1)return resultdef 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 << nprint('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 >> nprint('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_val2or_result = dec_val1 | dec_val2not_result1 = ~dec_val1not_result2 = ~dec_val2different_or_result = dec_val1 ^ dec_val2print('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 = 100101binary_val2 = 110100logic_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
欢迎关注我的微信公众号–机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!
程序员的数学笔记1--进制转换相关推荐
- 程序员的数学笔记3--迭代法
第三节课程,介绍的是迭代法. 前两节笔记的文章: 程序员的数学笔记1–进制转换 程序员的数学笔记2–余数 03 迭代法 什么是迭代法 迭代法,简单来说,其实就是不断地用旧的变量值,递推计算新的变量值. ...
- 程序员的数学笔记2--余数
上一节程序员的数学笔记1–进制转换是介绍了进制,特别是十进制和二进制之间的转换,移位操作和逻辑操作. 今天介绍的是余数,看完本节笔记,你会发现生活中有很多东西都有余数的影子. 余数 余数的特性 整数是 ...
- 【ACM算法】-- 数学问题篇 - 进制转换
第一题: 思路: 对于进制转换问题,其实理解了取模运算和 10 进制运算,基本是特别好理解的,在进制转换问题中,只需掌握,m 进制转换为 10 进制,10 进制转换为 n 进制即可,任何进制之间的转换 ...
- 计算机专升本基础笔记二 进制转换及二进制运算规则
进制转换及二进制运算规则 什么是进制? 进制就是进位计数制,是人为定义的带进位的计数方法.我们的时间就是六十进制(满60秒进一分钟,满60分钟进1小时):对于任何一种进制-X进制,就表示每 ...
- 山东专升本—计算机课堂笔记之进制转换
二进制:0 1 八进制:0~7 十进制:0~9 十六进制:0~15 -- 0~9 + A~F(在十六进制 10~15,10后面用字母表示) 进制的数码不可能"=>" ...
- 数字电路与逻辑设计 学习笔记【进制转换】
0.1近代开关理论:Relay-contact Network Theory: 继电-触点网络理论. 0.2,脉冲信号与数字信号, 模拟量->模拟信号:正弦信号.脉冲信号->脉冲电路 数字 ...
- 迭代反投影法代码_程序员的数学笔记3--迭代法
第三节课程,介绍的是迭代法. 03 迭代法 什么是迭代法 迭代法,简单来说,其实就是不断地用旧的变量值,递推计算新的变量值. 这里采用一个故事来介绍什么是迭代法,这个故事是讲述一个国王要重赏一个做出巨 ...
- C语言笔记:进制转换与32位二进制IP地址转换十进制问题
问题描述: 假设需要编写一个程序,实现32位二进制IP地址(32个字符长的1和0)转换为点分十进制格式并输出.IP地址的点分十进制格式通过将32位从低位到高位(右到左)一次分组八位,总共分4次,任何8 ...
- 工业用微型计算机笔记(1)-进制转换
最新文章
- form 中Enctype=multipart/form-data 的作用
- ASP.NET中常用功能代码总结(3)——上传图片到数据库
- [µC/GUI 学习]µC/GUI移植
- java二叉树删除子树_132-BST删除有一颗子树的结点
- antimalware可以关闭吗_iPhone最好关闭这4个设置,手机流畅还省电
- POSIX信号量API函数
- mysql execution plan_MySQL Execution Plan--NOT IN查询
- 【AudioVideo】MediaRecorder概述(21)
- Android用户界面开发:控件集合
- mtkwin10驱动_【MTK通用USB刷机驱动下载】MTK通用USB刷机驱动 Win7/Win10 自动安装版-开心电玩...
- 微信公众号运营推广基础入门知识
- XRD测试的68个问题(四)
- 百度搜索升级冰桶算法5.0
- Windows server 2016 Windows 10 离线下载与离线安装补丁教程 支持批量安装(其他win系统类似)
- WPF 让窗口激活作为前台最上层窗口的方法
- 制作篇3 - 制作agent-server镜像包
- 1024程序员节,以梦为马,不负韶华,我们来聊聊IT的发展以及个人感受吧!
- Stochastic Approximation
- 笔记本电脑wifi图标消失解决
- JavaScript-Tool:Numeral.js
热门文章
- 跑三小时的monkey测试该怎么算_浅谈App测试(下)~带音频
- 老司机学习MyBatis之如何通过select返回Map
- Linux下获得线程ID syscall(224)
- Makefile文件编写规则
- windows下Python+Editplus windows Python开发环境
- React开发(130):ant design学习指南之form中的新城多个表单
- 前端学习(3068):vue+element今日头条管理-日期处理
- 前端学习(2925):vue改变样式1
- 工作393-注册小程序
- [css] 你知道的等高布局有多少种?写出来