范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

程序员数学位运算如何使用二进制计算乘法?

  作者:小傅哥
  博客:https://bugstack.cn
  源码:https://github.com/fuzhengwei/java-algorithms
  沉淀、分享、成长,让自己和他人都能有所收获! 一、前言
  你是什么时候注意到位运算?
  从毕业入职公司看大佬的代码出现  2 << 4  开始?从小白晋升高开读框架的源码看到 MAXIMUM_CAPACITY = 1 << 30;  开始?还是从什么时候开始?
  其实二进制的位运算一直在我们那身边,从你开始编写 Hello Word 打印输出时就有二进制流的处理,只不过隐藏的很深不好发现。所以在我们开始意识到代码和二进制的关系往往都是来自于看到可以用二进制完成的计算,包括;二进制计算效率高于乘机,也包括二进制可以更好的体现出你要设置值的大小范围。比如你要设定一个指定范围大小的 Int 值 = 1073741824,那么是给这样一个整数值看起来直观,还是二进制 1<< 30 更直观呢?其实他们两个值是相等的。所以这样的情况下也会有二进制运算的体现。
  而小傅哥在学习编程阶段,第一次注意到二进制的运算是关于a、b两个值的互换,如果不引入第三个值就可以完成? int a = 2, b = 3; a = a ^ b; b = a ^ b; a = a ^ b;
  一个 ^ 帽子一样的运算符,就把两个数给替换,替换后 a = 3,b = 2 那它是怎么办到的呢?
  ^ 异或运算 :两个操作数的同位中,如果值相同(都是 0 或者都是 1)则为 0,不同(一个是 0,一个是 1)则为 1 以二进制数据为基础进行运算解析 a = 2 二进制数为 0010、b = 3 二进制数为 0011a = a ^ b = 0010 ^ 0011 = 0001b = a ^ b = 0001 ^ 0011 = 0010 = 2a = a ^ b = 0001 ^ 0010 = 0011 = 3 异或运算的基本定理解析 a = a ^ bb = a ^ b = a ^ b ^ b = a = 2a = a ^ b = a ^ a ^ b = b = 3
  而二进制的运算魅力还远不至于此,还可以完成奇偶判断、有效位计算、乘法、加法等。这些内容的学习可以让我们研发人员,积累编程逻辑和拓展思维模式。接下来小傅哥就带着大家学习一下。 二、位操作介绍
  位操作是程序设计中对位数组或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,位运算的运算速度通常与加法运算相同(仍然快于乘法运算),但是通常功耗较小,因为资源使用减少。
  四种基本的位运算包括;与&、或|、非~、异或^
  int a = 1; // 0001 int b = 2; // 0010 int c = 4; // 0100 int d = 8; // 1000 int e = 15;// 1111  // 与运算;0001 System.out.println(Integer.toBinaryString(a & e)); // 0001 // 或运算;0011 System.out.println(Integer.toBinaryString(a | b)); // 0011 // 非运算;0101 System.out.println(Integer.toBinaryString(a ^ c)); // 0101 // 异或运算;...11110111 System.out.println(Integer.toBinaryString(~d)); 与运算;两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。 或运算;两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。 非运算;两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。 异或运算;如果位为0,结果是1,如果位为1,结果是0 三、位运算案例1. 获取位值
  public int getBit(int number, int bitPosition) {     return (number >> bitPosition) & 1; } 目的 :获取二进制数字中,指定位置的值。逻辑 :该方法将目标值右移到最右边,即位数组的第0个位置上,如;0001 的二进制形式。之后与 1 进行与操作。如果目标位是1,那么结果就是1,反之结果是0;2. 设置位值
  public int setBit(int number, int bitPosition) {     return number | (1 << bitPosition); } 目的 :设置二进制数字中,指定位置的值逻辑 :1 就像一个子弹,左移指定位数到目标位置,如;0010 的二进制形式。与目标值 number 做或运算(把子弹打进去),设置结果并返回。3. 清空位值
  public int clearBit(int number, int bitPosition) {     int mask = ~(1 << bitPosition);     return number & mask; } 目的 :清空二进制数字中,指定位置的值逻辑 :类似于设置位值 ,把1左移指定位数后取反,从 0010 得到 1101 并与目标值 number 做与&运算,清掉目标位的值。4. 更新位值
  public int updateBit(int number, int bitPosition, int bitValue) {     int clearMask = ~(1 << bitPosition);     return (number & clearMask) | (bitValue << bitPosition); } 目的 :清空二进制数字中,指定位置的值逻辑 :结合清空clearBit、设置setBit,两个方法将制定位置替换为设置值。5. 偶数判断
  public boolean isEven(int number) {     return (number & 1) == 0; } 目的 :检测 number 是否为偶数逻辑 :检测二进制的最右侧一位,如果是1,那么一定是奇数。所以可以与1做与&运算的结果和0判断。不等于0是奇数,等于0是偶数。6. 正数判断
  public boolean isPositive(int number) {     if (number == 0) {         return false;     }     return ((number >> 31) & 1) == 0; } 目的 :判断 number 值是否为正数。逻辑 :基于二进制正数最左边的值是0的这个事实,右移31位,和1做与&运算,如果结果等于1为负数,反正为正数。7. 左移乘二
  public int multiplyByTwo(int number) {     return number << 1; } 目的 :乘以2逻辑 :该方法将原始数字向左移动一位。因此所有位都将乘以2,因此数字本身也将乘以2。8. 右移除二
  public int pideByTwo(int number) {     return number >> 1; } 目的 :除以2逻辑 :该方法将原始数字向右移动一位。因此所有位都将除以2,因此数字本身也将除以2,且不会产生余数。9. 正负交换
  public int switchSign(int number) {     return ~number + 1; } 目的 :正数转负数,负数转正数逻辑 :通过二进制异或运算取反,如 1000 = 8 取反 1.....0111 = -9 + 1 = -810. 乘法运算(有符号)
  public int multiply(int a, int b) {     int multiply = 0;     while (a != 0 && b != 0) {         System.out.print("计算步骤(" + (isEven(b) ? "偶数" : "奇数") + "):a(" + String.format("%04d", Integer.valueOf(Integer.toBinaryString(a))) + ") = " + a + " | b(" + String.format("%04d", Integer.valueOf(Integer.toBinaryString(b))) + ") = " + b);         // b 是偶数:2a * (b/2)         if (isEven(b)) {             a = multiplyByTwo(a);             b = pideByTwo(b);         }         // b 奇数         else {             // b 正数:2a * (b - 1)/2 + a             if (isPositive(b)) {                 multiply += a;                 a = multiplyByTwo(a);                 b = pideByTwo(b - 1);             }             // b 负数:2a * (b + 1)/2 - a             else {                 multiply -= a;                 a = multiplyByTwo(a);                 b = pideByTwo(b + 1);             }         }         System.out.println(" | multiply(" + String.format("%04d", Integer.valueOf(Integer.toBinaryString(multiply))) + ") = " + multiply);     }     return multiply; } 目的 :计算有符号二进制乘积公式 :推到公式与代码向对应 = a * b= 2a * (b/2) —— b为偶数= 2a * (b - 1)/2 + a —— b 为奇数、正数= 2a * (b + 1)/2 - a —— b 为奇数、负数 逻辑 :乘数a不断左移、乘数b不断右移。当b归0时,a左移累计下来的值就是乘积总和。如图11. 乘法运算(无符号)
  public int multiplyUnsigned(int number1, int number2) {     int result = 0;     int multiplier = number2;     int bitIdx = 0;     while (multiplier != 0) {         if ((multiplier & 1) == 1) {             System.out.println(number1 + " << " + bitIdx + " = " + (number1 << bitIdx));             result += number1 << bitIdx;         }         bitIdx += 1;         multiplier = multiplier >> 1;     }     return result; } 目的 :计算无符号二进制乘积 公式 :  13 = 2^3 + 2^2 + 2^0x*13 = x*2^3 + x*2^2 + x*2^0x*13 = x<<3 + x<<2 + x<<02*13 = 2<<3 + 2<<2 + 2<<0 = 16 + 8 + 2 = 26 逻辑 :每个数字都可以表示成一系列2的幂之和。例如 13 的二进制是 1101,最右侧第1位1,是2的0次幂,所以对应2的进制值是左移0位。再比如13的右数第3位是1,对应位置值是4也就是2的2次幂,所以对应2的进制值是左移2位。最终把这些值相加就是乘积值。 12. 一的数量
  public int countSetBits(int originalNumber) {     int setBitsCount = 0;     int number = originalNumber;     while (number != 0) {         setBitsCount += number & 1;         number >>>= 1;     }     return setBitsCount; } 目的 :使用位运算符对一个数字里设置为1的位进行记数逻辑 :把数字每次向右移动1位,然后使用&操作符取出最右边一位的值,1则记数加1,0则不计。13. 转换计算
  public int bitsDiff(int number1, int number2) {     return countSetBits(number1 ^ number2); } 目的 :计算一个数字,转换为另外一个数字,所需要的转换位数。逻辑 :当数字进行XOR异或运算时,结果将是不同位数的数量(即异或的结果中所有被设置为1的位的数量)。14. 有效位数
  public int bitLength(int number) {     int bitsCounter = 0;     while ((1 << bitsCounter) <= number) {         bitsCounter += 1;     }     return bitsCounter; } 目的 :计算二进制数值的有效位数,例如 14 = 1110 有效位为4位。逻辑 :通过1不断地左移加和与 number 做对比,只要比number小就累加1位。15. 幂值判断
  public boolean isPowerOfTwo(int number) {     return (number & (number - 1)) == 0; } 目的 :检查number是否为2的幂值。逻辑 :2的幂值形式的数字为2、4、8、16 等,那么可以把一个二进制数进行错位与&运算,如果错位比对都为0,那么就是2的幂数。16. 加法运算(Ripple-carry adder)
  public int fullAdder(int a, int b) {     int result = 0;     // 计算每次的进位值,1 + 1 = 0010 进位为1。是一种&运算。     int carryOut = 0;     System.out.println("| aBit | bBit | carryIn | aiPlusBi | bitSum | carryOut | result |");     for (int i = 0; i < 32; i++) {         int aBit = getBit(a, i);         int bBit = getBit(b, i);         int carryIn = carryOut;         System.out.print("|   " + aBit + "  |  " + bBit + "   |       " + carryIn);         // 加和 - 两个值;如果相同则为0,不相同则为1         int aiPlusBi = aBit ^ bBit;         System.out.print(" |        " + aiPlusBi);                // 加和 - 进位;         int bitSum = aiPlusBi ^ carryIn;         System.out.print(" |      " + bitSum);                // 进位;同位置 ai & bi = 1 | 与进位 aiPlusBi & carryIn = 1         carryOut = (aBit & bBit) | (aiPlusBi & carryIn);         System.out.print(" |  " + carryOut + "(" + Integer.toBinaryString(carryOut) + ")   ");                // 累加;把当前位置计算的值,左移n位         result = result | (bitSum << i);         System.out.println(" | " + result + "(" + String.format("%04d", Integer.valueOf(Integer.toBinaryString(result))) + ")|");     }     return result; } 目的 :计算有符号二进制加法逻辑 :二进制的累加可以对照下计算10进制累加时一样,对应2个数字相加,当有进位的时候记录进位。 首先二进制的加和计算,1+1 = 10、1+0=01、0+1=01、0+0=00,那么正好对应上 ^ 非运算,相同则为0,不相同则为1,因为即使两个1相加,当前位的值也是0。之后是进位相加,两数想加后,还可能有进位上来的数值与两数进行相加。结果相加完成后,计算进位,并保留进位用于下次计算。进位的计算为;ai & bi = 1 | 与进位 aiPlusBi & carryIn = 1,无论是两数相加,还是两数的和 aiPlusBi 与进位相加,只要与运算是1,那么就要保留进位。最后是累加结果,把对应位置的结果计算,按照当前计算到到二进制的位数左移到目标为止,累加到 result,最后就是结果值。 四、常见面试题& 和 ~ 是什么运算? 两数交换不引入第三个变量如何处理? 二进制中1个个数怎么计算? 实现一个两数加和? 实现一个无符号两数成绩?

好看有趣的儿童启蒙绘本,趣学伴绘本故事放映机体验很多孩子都比较喜欢听故事,每天晚上睡觉前都会缠着父母讲一个故事,才能安心入眠,但大多数父母工作都比较繁忙,知道的故事也有限,又担心孩子玩手机或平板沉迷游戏。想给孩子买个故事机,很多职场办公,就选自动双面打印机不得不说,办公室有台小巧一点的打印机真的太重要了平常临时有个文件什么的需要打印,直接就能打印出来不用跟业务部门抢大打印机,非常方便der我们用的是惠普M232dw双面激光一体机,这iPhone14不用typeC接口,苹果硬杠?应对其反垄断并采取巨额罚款iPhone14已投入生产,据称该款手机将继续采用Lightning接口,而没有改用typeC接口,这意味着苹果选择了硬杠,对此笔者认为或许应该学习欧洲对它进行反垄断调查并采取巨额什么笔记本办公最好用?抗造又耐用评测笔记本电脑在平时使用的过程中,不知道你有没有遇到过不小心将水洒到键盘上的情况。有人说遇到这种情况需要立刻关机拔掉电源,然后将笔记本电脑扣过来,然后拍一拍,将键盘中的水控一控,防止主颜值性能双在线HyperX霓虹粉配色游戏外设玩家在选择游戏外设时往往会遇到这样的问题,颜值高的性能却不够理想,性能出众的颜值可能又平平淡淡,很难遇见两全其美的选择。而极度未知(HyperX)推出的两款霓虹粉配色产品,属于颜值三星可能会降低GalaxyS和A的销量转而支持折叠智屏手机不可否认,长期以来,三星一直将可折叠视为成功的一种方式,而且可以肯定地说,可折叠手机是智能手机的未来。三星是世界上最大的公司之一。其产品组合中有很多手机,然而,随着即将推出的Gal苹果公司秋季将推出锁定模式你再也不用怕黑客攻击你了苹果公司宣布推出锁定模式,这是一种针对有针对性的网络攻击的极端防御措施,旨在保护政治家活动家和其他公众人物免受智能手机的针对性骚扰。锁定模式将尽可能保护用户免受黑客病毒和机器人攻击ROG游戏手机6Pro配置强悍,ROG游戏手机5低至百元上演砸场闹剧腾讯ROG游戏手机6Pro可以说是充分发挥了骁龙8Gen1的所有性能,并依靠其出色的散热,让性能输出非常稳定,保证了游戏满帧流畅运行。散热风扇6对帧率的影响很小。只能说手机本身的性iG辅助太离谱,Uzi忍不住质疑其假赛没一步正常操作,严查iG一支曾经辉煌无比的队伍,帮助LPL捧回了第一座S赛的奖杯,并贡献了无数的名场面,但在S9之后,iG的内部出现了一些问题,冠军队伍解散,甚至连iG的灵魂Rookie也未能保下来,鬼谷八荒刑天也太难打了,血量将近2亿不说容错率还低大家好,我是戒戒,专注于分享游戏心得和趣事的戒戒说起刑天小伙伴们在很多游戏里都有见过他的身影,他是我国古代神话传说中的人物,在和黄帝大战的时候被斩去了头颅。失去了首级之后的刑天以自英雄联盟12。12b版本卡特的符文出装推荐近日Riot官方设计师在推上更新了英雄联盟12。12b12。13版本的英雄改动名单,其中12。12b版本的热补丁对卡特进行了史诗级加强!下面,就为大家带来几套这个版本最适合卡特的符
万科郁亮新房需求上有天花板,下有保底线中新网3月31日电(中新财经记者左宇坤)31日上午,万科企业股份有限公司召开2022年度业绩推介会。对于备受关注的房地产市场形势问题,万科董事会主席郁亮认为市场既没有狂飙,也没有倒换季后出境机票均价降近两成,东南亚单程均价不到1500元,日韩泰降幅最高3月26日,中国民航正式执行2023夏秋航季航班计划。新航季开启后,国际航班机票价格呈明显下降趋势。本周出境机票含税均价2206元环比降幅达到17携程数据显示,本周以来,预订跨境整自旋神经形态器件方面研究获进展生物启发脉冲神经网络架构有望通过模拟人脑的高算力高并行度低功耗等特性,解决冯诺依曼架构存储墙和能效瓶颈等问题。然而,面向构建脉冲神经网络的神经形态硬件的研究尚处于探索阶段,基于传统杉杉股份继承权之争迎新进展原配之子再下一城因为创始人兼董事长郑永刚先生在今年2月10日突发心脏疾病救治无效,A股上市公司杉杉企业陷入了一番继承权争夺战的豪门之争由郑永刚原配之子91年的郑驹VS继母周婷(85年)。日前,杉杉深度剖析基于LAMOST数据与机器学习方法测定大样本恒星年龄引言星系是构成宇宙的基本单元,银河系是我们目前唯一能进行详细解剖的星系。对银河系结构和形成历史的研究是我们理解星系的基础。年龄是研究银河系目前结构和形成历史最重要的基本参数之一。对奥林匹克中国行走进湖州暨湖州市吴兴区迎亚运系列活动举行来源中国经济网3月28日,奥林匹克中国行走进湖州暨湖州市吴兴区迎亚运系列活动,在中建一局华江公司承建的湖州奥林匹克青少年文化中心湖州奥青汇园区项目召开,现场还举行了奥林匹克青少年文碧桂园向前看提升一二线城市投资额发展围绕一体两翼2022年是充满挑战的一年,压力测试下很多房企表现不合格,暴露出抵御风险的脆弱。当市场信心跌入谷底,更需要头部房企展露出压舱石的作用,给到行业复苏的信心。房地产行业经历深度调整期,媒体谁在开发一键脱衣App行为龌龊已严重触犯法律应严惩开发者一位女网友在网上晒出了自己在地铁车厢里的照片,却被人用AI技术一键脱衣。这样一来,一张很正常的女性的生活照,变成了衣不蔽体的照片。网上不少非法网站还提供一键脱衣的AI技术,并且这些广西梧州综合保税区封关运营打造合作开放新高地广西梧州综合保税区封关运营。邓超妍摄中新网南宁3月31日电(张广权曾燕谷广田)3月31日上午,广西梧州综合保税区正式封关运营,标志着梧州综合保税区可正式开展业务。梧州综合保税区于2成都大运会代表团团长春季会议举行人民网北京3月30日电(记者杨磊)3月28日至31日,成都大运会代表团团长春季会议在成都举行,共有79个代表团参会,其中33个代表团现场参会,46个代表团通过线上方式参会。按照国际多位媒体人暗示足协又出大鱼!曾出任亚足联要职,今年落选执委每到星期五,就是中国足协高层出事的前兆,根据多位国内媒体人的暗示,中国足协疑似又有高层级别人物涉及到此前的反赌扫黑案。而且媒体人徐江透露,此人曾经在亚足联担任要职,但疑似今年的亚足