程序员的数学基础课
黄申
LinkedIn 资深数据科学家
83374 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
导读 (1讲)
基础思想篇 (18讲)
程序员的数学基础课
15
15
1.0x
00:00/00:00
登录|注册

01 | 二进制:不了解计算机的源头,你学什么编程

二进制适合逻辑运算
二进制的抗干扰能力
逻辑电路的两种状态
二进制转换成十进制
十进制转换成二进制
Java中的实现方式
八进制和十六进制计数法
二进制数位的表示
数字2871的表示
阿拉伯数字计数
罗马数字计数
原始时代的计数方法
按位“异或”的结果
二进制按位“异或”的操作
按位“与”的结果
二进制按位“与”的操作
按位“或”的结果
二进制按位“或”的操作
右移位的结果
向右移位的操作
左移位的结果
向左移位的操作
计算机为何使用二进制
二进制和十进制的互相转换
二进制计数法
十进制计数法
人类计数的发展史
思考题
学习笔记的重要性
二进制对数据结构和算法的影响
二进制在计算机中的应用
二进制的重要性
位的“异或”
位的“与”
位的“或”
向右移位
向左移位
二进制在计算机中的应用
二进制计数法
总结
二进制的位操作
计算机的起源

该思维导图由 AI 生成,仅供参考

我们都知道,计算机的起源是数学中的二进制计数法。可以说,没有二进制,就没有如今的计算机系统。那什么是二进制呢?为什么计算机要使用二进制,而不是我们日常生活中的十进制呢?如何在代码中操作二进制呢?专栏开始,我们就从计算机认知的起源——二进制出发,讲讲它在计算机中的“玄机”。

什么是二进制计数法?

为了让你更好地理解二进制计数法,我们先来简单地回顾一下人类计数的发展史。
原始时代,人类用路边的小石子,来统计放牧归来的羊只数量,这表明我们很早就产生了计数的意识。后来,罗马人用手指作为计数的工具,并在羊皮上画出Ⅰ、Ⅱ、Ⅲ来代替手指的数量。表示一只手时,就写成“Ⅴ”形,表示两只手时,就画成“ⅤⅤ”形等等。
公元 3 世纪左右,印度数学家(也有说法是阿拉伯人)发明了阿拉伯数字。阿拉伯数字由从 0 到 9 这样 10 个计数符号组成,并采取进位制法,高位在左,低位在右,从左往右书写。由于阿拉伯数字本身笔画简单,演算便利,因此它们逐渐在各国流行起来,成为世界通用的数字。
日常生活中,我们广泛使用的十进制计数法,也是基于阿拉伯数字的。这也是十进制计数法的基础。因此,相对其他计数方法,十进制最容易被我们所理解。
让我们来观察一个数字:2871。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入浅出地介绍了计算机编程中二进制的重要性和应用。从人类计数的发展史出发,阐述了十进制和二进制的概念及相互转换,并通过Java代码示例展示了十进制和二进制的互相转换过程。文章指出计算机使用二进制的原因,强调了二进制在逻辑电路中的可靠性和抗干扰能力。此外,还介绍了计算机语言中针对二进制的位操作,包括向左移位、逻辑操作以及位的“或”、“与”、“异或”操作。通过历史、理论和实践相结合的方式,读者能够快速了解二进制在计算机编程中的重要性和应用。文章还提出了思考题,引发读者思考和交流。整体而言,本文内容丰富,涵盖了二进制的基础知识和在计算机编程中的实际运用,适合对计算机编程感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的数学基础课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(215)

  • 最新
  • 精选
  • William
    置顶
    老师,您好. 请问下面这个,为什么是补1 ,而不是补0? “算术右移时保持符号位不变,除符号位之外的右移一位并补符号位 1。补的 1 仍然在符号位之后。

    作者回复: 你可以看下加餐部分关于负数的补码,就能明白了

    2019-07-30
    4
    7
  • 无双
    请问有没有方法,快速实现进制转换,比如二进制、十进制、八进制、十六进制互相转化,我考试有要求要转,就是笔算,谢谢。

    作者回复: 如果要快速在二进制、八进制和十六进制间转换,方法确实存在,可以上网查一些资料。如果很多人都感兴趣,我可以加入

    2018-12-10
    2
    95
  • huang
    算术左移和逻辑左移一样,是因为对于有符号数来说,如果数据最高位(第二个bit)和符号位(第一个bit)不同,则左移之后必然溢出。 举个例子,8个bit表示-128-127,如果数据最高位和符号位不同,则这个数的绝对值肯定大于64,左移一位肯定溢出。 所以“有效”的左移不用担心数据最高位会改变符号位,也就不用区分逻辑左移和算术左移。

    作者回复: 很好的回答

    2019-01-15
    6
    87
  • King
    /** * @Title: decimalToBinary * @Description: 十进制转二进制,方法1:余数短除法除以二 * @param decimalSource * @return: String */ /*public static String decimalToBinary(int decimalSource) { StringBuilder sb = new StringBuilder(); while (decimalSource != 0) { sb.append(decimalSource % 2); decimalSource = decimalSource >> 1; } return sb.reverse().toString(); }*/ /** * @Title: decimalToBinary * @Description: 十进制转二进制,方法2:降二次幂及减法混合运算 * @param decimalSource * @return: String */ /*public static String decimalToBinary(int decimalSource) { int length = (int) (Math.log(decimalSource) / Math.log(2)); StringBuffer sb = new StringBuffer(); do { decimalSource = (int) (decimalSource - Math.pow(2, length)); int power = decimalSource <= 0 ? -1 : (int) (Math.log(decimalSource) / Math.log(2)); for (int i = length; i > power; i--) { if (i == length) { sb.append("1"); } else { sb.append("0"); } } length = power; } while (decimalSource > 0); return sb.toString(); }*/ /** * * @Title: decimalToBinary * @Description: 十进制转二进制,方法3:位运算法 * @param decimalSource * @return * @return: String */ public static String decimalToBinary(int decimalSource) { StringBuffer sb = new StringBuffer(); while (decimalSource != 0) { //此&运算,decimalSource & 1,目的是获取最低位的二进制数值 sb.append(decimalSource & 1); //此>>运算,decimalSource >> 1,目的是将获取到的最低位二进制数值除去 decimalSource = decimalSource >> 1; } return sb.reverse().toString(); } 负整数转换为二进制 要点: 取反加一 解释:将该负整数对应的正整数先转换成二进制,然后对其“取补”,再对取补后的结果加1即可。 例如要把-52换算成二进制: 1.先取得52的二进制:00110100 2.对所得到的二进制数取反:11001011 3.将取反后的数值加一即可:11001100 即:(-52)10=(11001100)2

    作者回复: 很好的总结

    2019-01-12
    4
    71
  • 南山
    逻辑或,与,异或一般有什么使用场景,平常写代码不怎么用

    作者回复: 在elasticsearch的filter查询中,用到的bitset就是位运算,比查询倒排索引效率更高

    2018-12-10
    43
  • 溯雪
    老师,为什么不需要区分逻辑左移和算术左移呢? 比如十进制数-3,对应二进制1000...0011,那按照右移的思路,应该有两种移法,一种是符号位不动其它位置左移的1000...0110,一种是全部左移导致符号位被顶出去的0000....0110嘛

    作者回复: 右移存在一个问题是,在高位补0还是1。但是左移只需要考虑后面补0就可以了

    2018-12-10
    5
    37
  • Libra
    import java.util.Scanner; public class Test1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int value = scanner.nextInt(); boolean flag = false; for (int i = 31; i >= 0; i--) { int temp = value & (1 << i); if (temp > 0){ flag = true; } if (flag){ if (temp > 0){ System.out.print(1); }else { System.out.print(0); } } } } }

    作者回复: 还可以考虑负数的情况

    2018-12-10
    17
  • sloth-yp
    最后的思考题, 是不是应该考虑负数,用补码表示? public static String decimal2Binary(int decimal) { // 负数的话,先换成正数然后取反再加1,再递归调用本函数 if (decimal < 0) { int reverseNumber = ((decimal * -1) ^ Integer.MAX_VALUE) + 1; return decimal2Binary (reverseNumber); } StringBuilder sb = new StringBuilder(); while (decimal > 0) { // 跟0x0001 按位与,求得最低位的值 String lastNumber = String.valueOf(decimal & 1); // 插入到字符串的最前面(这样才是原始的顺序) sb.insert(0, lastNumber); // 算术右移 decimal = decimal >> 1; } return sb.toString(); }

    作者回复: 是的 需要考虑补码

    2018-12-18
    2
    16
  • panda
    异或 我想到一个算法题 判断很多数是不是有相等的

    作者回复: 是的 很经典的一道面试题

    2018-12-11
    16
  • daydreamer
    我查了一下Python里面没有“逻辑右移”运算符吧,除非自己手动实现

    作者回复: 我又查了一下,确实需要自己实现

    2018-12-18
    13
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部