程序员的数学笔记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 有内建函数可以直接实现这几个进制之间的转换,比如binocthex分别表示将十进制数转换为二进制、八进制和十六进制,而将其他进制转换为十进制,则可以用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))

计算机为什么使用二进制?

  1. 二进制的数据表达具有抗干扰能力强、可靠性高的优点;
  2. 二进制非常适合逻辑运算;
  3. 组成计算机系统的逻辑电路通常只有两个状态,即开关的接通和断开。

二进制的位操作

移位操作

二进制左移一位,表示将数字翻倍,即乘以 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)

测试的两个二进制数值分别是100101110100,输出结果如下,这里非的操作会实现按位取反,对于有符号数,如果是正数就会变为一个负数。

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


欢迎关注我的微信公众号–机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android层级关系图,画出 View 的层级 3D 图和树形图来分析层级关系

HierarchyLayout 介绍HierarchyLayout是一个自定义的ViewGroup工具&#xff0c;用于分析视图的层级关系&#xff0c;并画出层级树的结构图和可交互的3D 层级View:HiearchyLayout的静态图&#xff0c;实际是可随手势改变 3D 形态的。hierarchyView.jpeghierarchyViewNode.jpeghi…

换个角度看GAN:另一种损失函数

转载自&#xff1a;机器之心选自Medium作者&#xff1a;Phc L机器之心编译参与&#xff1a;张玺「本质上&#xff0c;GAN 就是另一种。」Jeremy Howardf 老师曾在&#xff08;GAN&#xff09;课程中说过&#xff1a;「……本质上&#xff0c;GAN 就是另一种损失函数。」本文将在…

程序员的数学笔记2--余数

上一节程序员的数学笔记1–进制转换是介绍了进制&#xff0c;特别是十进制和二进制之间的转换&#xff0c;移位操作和逻辑操作。 今天介绍的是余数&#xff0c;看完本节笔记&#xff0c;你会发现生活中有很多东西都有余数的影子。 余数 余数的特性 整数是没有边界的&#xf…

机器学习入门系列(1)--机器学习概览

本文比较长&#xff0c;八千字&#xff0c;建议收藏起来慢慢看&#xff01;此外&#xff0c;这其实是合并公众号最开始写的两篇文章&#xff0c;整合在一起了。机器学习入门系列(1)--机器学习概览(上)机器学习入门系列(2)--机器学习概览(下)主要参考《hands-on-ml-with-sklearn…

[bbk5307]第76集 第9章 -数据库性能维护 03

/* Oracle optimizer 执行选择方式原理分析 */ select * from emp where empno7369; oracle在执行查询计划的时候&#xff0c;并不是说要执行一次全表扫描和一次索引扫描之后&#xff0c;来决定到底是走哪一条路?而是通过数据字典里的统计数据信息&#xff0c;来分析判断到底是…

[资源]推荐一些Python书籍和教程,入门和进阶的都有!

前几天后台有读者留言说希望推荐一些入门的书籍&#xff0c;所以这几天都在整理一些我入门时候学习过的书籍教程&#xff0c;或者是口碑还不错的书籍&#xff01;入门和进阶书籍教程入门和进阶方面的书籍教程&#xff0c;这里推荐两本书和一个教程。1. 廖雪峰老师的 Python 教程…

html 状态栏不显示文字,电脑打字的时候输入法不显示状态栏怎么办?

有时我们在打字的时候&#xff0c;输入法不显示&#xff0c;能打出汉字&#xff0c;但无法选字&#xff0c;这就给输入字体造成了很大的麻烦。怎么解决呢&#xff1f;下面以搜狗输入法为例&#xff0c;描述详细解决过程。解决方法一1、我在某个网页输入字体的时候&#xff0c;没…

系统在iis6上部署

1. 安装Framework 4.0 服务器安装Framework4.0版本。 2. 安装IIS 2.1 安装IIS6.0步骤 1) 在添加或删除程序,单击“添加/删除Windows组件”。 2) 勾选“应用程序服务器”&#xff0c;并单击“详细信息”。 3) 勾选“ASP.NET/IIS/启用网络COM访问/启用网络DTC访问”信…

[Github 项目推荐] 一个更好阅读和查找论文的网站

第 28 篇原创文章机器学习发展到现在&#xff0c;已经积累了非常多的文章&#xff0c;特别是深度学习火起来后&#xff0c;每年新增加的论文非常多&#xff0c;如果需要研究某个领域&#xff0c;不仅需要阅读这个领域经典的论文&#xff0c;也必须时刻关注最新的学术进展&#…

html下拉选择框箭头改为年,CSS自定义select下拉选择框的样式(不用其他标签模拟)...

今天群里有人问到怎么自定义select下拉选择框的样式&#xff0c;于是群里就展开了激烈的讨论&#xff0c;刚开始一直就是考虑怎样使用纯CSS实现&#xff0c;把浏览器默认的样式覆盖掉&#xff0c;但最后均因兼容问题处理不好而失败告终&#xff0c;最后的解决方案就是用其他的元…

【语言处理与Python】10.1自然语言理解\10.2命题逻辑

10.1自然语言理解 查询数据库 如果有人提出一个问题&#xff1a; Which country is Athens in? 得到的回答应该是&#xff1a; Greece. 这个数据可以通过数据库语言得到答案&#xff1a; SELECT Country FROM city_table WHERE City athens 这里有一个文法&#xff0c;可以把句…

程序员的数学笔记3--迭代法

第三节课程&#xff0c;介绍的是迭代法。 前两节笔记的文章&#xff1a; 程序员的数学笔记1–进制转换程序员的数学笔记2–余数 03 迭代法 什么是迭代法 迭代法&#xff0c;简单来说&#xff0c;其实就是不断地用旧的变量值&#xff0c;递推计算新的变量值。 这里采用一个…