01 | 二进制:不了解计算机的源头,你学什么编程
黄申
该思维导图由 AI 生成,仅供参考
我们都知道,计算机的起源是数学中的二进制计数法。可以说,没有二进制,就没有如今的计算机系统。那什么是二进制呢?为什么计算机要使用二进制,而不是我们日常生活中的十进制呢?如何在代码中操作二进制呢?专栏开始,我们就从计算机认知的起源——二进制出发,讲讲它在计算机中的“玄机”。
什么是二进制计数法?
为了让你更好地理解二进制计数法,我们先来简单地回顾一下人类计数的发展史。
原始时代,人类用路边的小石子,来统计放牧归来的羊只数量,这表明我们很早就产生了计数的意识。后来,罗马人用手指作为计数的工具,并在羊皮上画出Ⅰ、Ⅱ、Ⅲ来代替手指的数量。表示一只手时,就写成“Ⅴ”形,表示两只手时,就画成“ⅤⅤ”形等等。
公元 3 世纪左右,印度数学家(也有说法是阿拉伯人)发明了阿拉伯数字。阿拉伯数字由从 0 到 9 这样 10 个计数符号组成,并采取进位制法,高位在左,低位在右,从左往右书写。由于阿拉伯数字本身笔画简单,演算便利,因此它们逐渐在各国流行起来,成为世界通用的数字。
日常生活中,我们广泛使用的十进制计数法,也是基于阿拉伯数字的。这也是十进制计数法的基础。因此,相对其他计数方法,十进制最容易被我们所理解。
让我们来观察一个数字:2871。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入浅出地介绍了计算机编程中二进制的重要性和应用。从人类计数的发展史出发,阐述了十进制和二进制的概念及相互转换,并通过Java代码示例展示了十进制和二进制的互相转换过程。文章指出计算机使用二进制的原因,强调了二进制在逻辑电路中的可靠性和抗干扰能力。此外,还介绍了计算机语言中针对二进制的位操作,包括向左移位、逻辑操作以及位的“或”、“与”、“异或”操作。通过历史、理论和实践相结合的方式,读者能够快速了解二进制在计算机编程中的重要性和应用。文章还提出了思考题,引发读者思考和交流。整体而言,本文内容丰富,涵盖了二进制的基础知识和在计算机编程中的实际运用,适合对计算机编程感兴趣的读者阅读学习。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的数学基础课》,新⼈⾸单¥68
《程序员的数学基础课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(215)
- 最新
- 精选
- William置顶老师,您好. 请问下面这个,为什么是补1 ,而不是补0? “算术右移时保持符号位不变,除符号位之外的右移一位并补符号位 1。补的 1 仍然在符号位之后。
作者回复: 你可以看下加餐部分关于负数的补码,就能明白了
2019-07-3047 - 无双请问有没有方法,快速实现进制转换,比如二进制、十进制、八进制、十六进制互相转化,我考试有要求要转,就是笔算,谢谢。
作者回复: 如果要快速在二进制、八进制和十六进制间转换,方法确实存在,可以上网查一些资料。如果很多人都感兴趣,我可以加入
2018-12-10295 - huang算术左移和逻辑左移一样,是因为对于有符号数来说,如果数据最高位(第二个bit)和符号位(第一个bit)不同,则左移之后必然溢出。 举个例子,8个bit表示-128-127,如果数据最高位和符号位不同,则这个数的绝对值肯定大于64,左移一位肯定溢出。 所以“有效”的左移不用担心数据最高位会改变符号位,也就不用区分逻辑左移和算术左移。
作者回复: 很好的回答
2019-01-15687 - 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-12471 - 南山逻辑或,与,异或一般有什么使用场景,平常写代码不怎么用
作者回复: 在elasticsearch的filter查询中,用到的bitset就是位运算,比查询倒排索引效率更高
2018-12-1043 - 溯雪老师,为什么不需要区分逻辑左移和算术左移呢? 比如十进制数-3,对应二进制1000...0011,那按照右移的思路,应该有两种移法,一种是符号位不动其它位置左移的1000...0110,一种是全部左移导致符号位被顶出去的0000....0110嘛
作者回复: 右移存在一个问题是,在高位补0还是1。但是左移只需要考虑后面补0就可以了
2018-12-10537 - Libraimport 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-1017 - 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-18216 - panda异或 我想到一个算法题 判断很多数是不是有相等的
作者回复: 是的 很经典的一道面试题
2018-12-1116 - daydreamer我查了一下Python里面没有“逻辑右移”运算符吧,除非自己手动实现
作者回复: 我又查了一下,确实需要自己实现
2018-12-1813
收起评论