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

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

  作者:小傅哥
  博客: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个个数怎么计算? 实现一个两数加和? 实现一个无符号两数成绩?

尺帝怒了!赛后霸气喊话Gumayusi下次看准人了再挑衅LCK赛区焦点大战T1对阵GEN的比赛已经结束了,最终的赛果由GEN20击败T1,拿下了夏季赛阶段的7连胜,同时还超越了T1,排名上升到LCK联赛第一的位置。可以说这一场是赚得盆满吃鸡还有完没完?跑车皮肤还有隐藏款,比路特斯更唬人欢迎诸位小伙伴们来到天哥开讲的吃鸡小课堂可能在许多和平精英玩家的眼里,能够升级的路特斯载具皮肤已经是巅峰了,光子此后可能会还原PubgM的圣装,也就是可以升级的衣服,但是载具皮肤却酒馆战棋异变多彩龙重做后重振一本流,盘活伊瑟拉成为版本答案炉石传说酒馆战棋经历了更新补丁之后,酒馆环境又产生了不小的变化,英雄劫匪之王托瓦格尔的表现非常亮眼,但是更加强力的是现在的版本答案一本流伊瑟拉,而之前称霸酒馆的滑油机器人则在一次热49的用户想换苹果,什么正在赶走安卓玩家?尽管安卓主导着全球手机市场,但iPhone总是作为一种优越感的存在。随着市场的变化,两者之间的差异非但没有缩小,大家对两者的刻板印象更深了。最新的一项调查显示,49的安卓用户正在考荣耀60,一款接近完美的中端手机发布于2021年12月1日。搭载了骁龙778G移动平台,其CPU部分由四颗CortexA782。4GHz和四颗CortexA551。8GHz构成,性能足够满足两到三年的使用。GPUiPhone14即将发布,苹果官宣AppleCare用户可半价购买iPhone14系列,快发布了,但也要涨价了。iPhone14Pro要涨价100美元。贵吗?已跪,对钱包伤害极大。有办法可以不让iPhone14Pro这么贵吗?有,那就不买,立省百首发789元,TPLINK新款轻舟路由AX6000今晚开售IT之家8月18日消息,本月初,TPLINK推出了采用内置天线设计的TPLINK轻舟路由AX6000(XDR6086),售价829元,首发789元,今晚8点正式开卖。IT之家了解到256GBIMX80066W,荣耀新机跌至2399元漂亮的手机,谁都喜欢,尤其是对于线下机型来说,颜值手感相比什么性能直接决定了用户的第一印象,这一点大家同意吗?当然,如果配置上还能再出几个优点的话,这样的手机往往在线下和线上都会有智能手表适合什么人群配戴?学生,职场人士,教师,老板就连现在的小孩都戴上手表了,似乎找不到没有戴过手表的人。现在智能手表都挺普遍的。学生戴很合适,显得高科技,无论是看时间,运动,听音乐,都方便得很。职场人士玩家在MC安装150个Mod,创造出了超究极Bug苦力怕五花牛安装Mod模块通常是为了让游戏增加额外的功能或内容来获得乐趣,装得太多偶尔也会出现冲突或闹出Bug的例子,不过日本有Minecraft玩家愉快生活送太郎(下称愉快生活太郎)却因为装低配小内存手机怎么玩大包体游戏?云明日之后来帮你明日之后激情开战,末日来临要如何守住自己的家?无论是热爱激情四射的逃杀战斗还是喜欢充满温情的修筑小屋环节,各类玩家都可以在明日之后找到适合自己的玩法!生存创造真是YYDS!许多玩家今日全球经济关于通货膨胀见顶的五个问题作者JeffreyYoung通货膨胀正在达到峰值。纽约时间2022年8月15日上午1004。1。与五月份的预期相比,通货膨胀发展情况如何?2。通货膨胀的驱动因素是什么?3。通货膨胀数字经济全景白皮书绿色金融篇重磅发布易观分析数字经济全景白皮书浓缩了易观分析对于数字经济各行业经验和数据的积累,并结合数字时代企业的实际业务和未来面临的挑战,以及数字技术的创新突破等因素,最终从数字经济发展大势以及各以会招商以展招商来自2022世界5G大会的思考来源黑龙江日报2022世界5G大会闭幕,全省数字经济领域签约项目226个,签约金额1031。8亿元,其中,在闭幕式现场签约项目39个,签约额332。1亿元,为大招商招大商的黑龙江注草根组合安与骑兵,为何走到了今天这步田地?2013年,一个草根组合安与骑兵一路过关斩将,打败云飞,周艳,雪儿等实力歌手,拿下了星光大道的年度总冠军。虽然这个结果令不少观众难以接受,但安与骑兵的确凭这个节目火了,他们的追梦之为什么这几年在公共场合越来越少见到马云了?在现如今的电商大环境下提到马云那可是无人不知无人不晓,从一名平凡的外语本科毕业生到后来的阿里巴巴创始人兼董事长,甚至有人将他已经捧到了中国首富的地位上超过了曾经的首富李嘉诚,究其原几款堪称黑科技的APP真后悔没没早点遇到今天给大家推荐的这几款APP早用早受益,全是小众实力派,用了根本停不下来!一伴婚恋这款APP很适合以结婚为目的进行交友的宝子们。这里有超多优质的单身小哥哥小姐姐,不管你是来找给你依生化危机将成真?2019年,美国耶鲁大学神经科学家NenadSestan领导的一个研究小组发现,在给死亡后不久的猪的大脑中安装灌注系统可以减轻脑组织损伤。一些神经元可以代谢工作,甚至产生典型的电脉开学季哪些手机值得入手呢九月将近各大手机厂商都以及将下半年需要发布的机型给发不出来了,那么这种情况就意味着在这个时间段我们时可以放心大胆的去买那些大幅度降价的手机的。首当其冲的就是红米K40s,K40系列中美报告出炉,新能源车越卖越火,质量为啥越做越差?很有可能,在2022年接下来的5个月里,会有单月出现新能源渗透率超过30的情况发生。也就是,每卖出3辆车里,就有1辆是新能源。这种可能性并不小,因为根据工业和信息化部在今年7月公布5G工程受到质疑,为何运营商要关闭5G基站?发生了什么阅读下面文章之前,希望您能够在上方点个免费的关注!接下来您每天都能够收到免费的国际资讯哟!您的关注是我的动力多多支持下嘛!!随着科技时代的进步,移动通信技术成为了各国未来所要重点研突发!恒大汽车被传卖身,许家印翻身梦碎,谁是接盘侠?劲爆消息!恒大汽车要卖身了。近日,界面报道说,政府部门正在牵头让一家汽车公司收购恒大汽车。据说,目前各方正处于僵持阶段,恒大方面不太愿意放手。2018年以来,但凡跟新能源汽车沾一点
这场现场会,在潍坊滨海召开!为推进文创产品研发,壮大文创产品和旅游产品规模,助推产品走出去,助推文创生产企业增收,滨海区拟召开文创产品及旅游商品研发和营销推广现场会,届时欢迎相关企业抖音直播达人积极参与。一时中国电子旗下成都华微谋上市,曾长期与振华风光共享负责人IPO观察(集成电路,来源视觉中国)继振华风光(688439。SH)登陆科创板后,中国电子信息产业集团有限公司(以下简称中国电子)的资产证券化再下一城,旗下又一家企业来到A股门口。2月17日汽车带T的注意了,这三个习惯会加快磨损,老司机有则改之进入2023年以来,国内汽车市场重新迸发活力,一大批新车相继上市,但是车型分布上出现了转变,在去年同时期,新车还以传统燃油车为主,而今年是新能源汽车唱大戏,由此可见,新能源汽车的热情人节想送男友衣服可太难商场里的本土男装为什么又贵又老气?记者陈奇锐编辑楼婍沁情人节临近,购物中心里挤满了为对方挑选礼物的情侣。香水和彩妆通常是送给女友的礼物,而西服则常常出现在给男友的送礼清单里。在互联网公司工作的徐琳就有这样的打算,但完了,马上分娩了痔疮也发了,到时候会不会不能顺产啦!琳达从怀孕开始,就下定决心要顺产了,前面怀孕的过程还比较顺利,每个月的产检也都挺正常的,就一心期待着自己的宝宝可以早点来跟她见面。到怀孕中期开始她就感觉到上厕所不如以前顺畅了,但是冬春之交的美好,雪与花的争艳,带上镜头开启寻美之旅寒雪梅中尽,春风柳上归闹春的节奏收了尾明媚的春色也悄悄来到人间山野林木的线条渐渐柔和带着镜头,走进自然听空谷清音起,看一曲桃花水感受春色撩人,柳烟成阵香港中国旅游出版社每周精选图片滨州这一景区今日恢复!滨州黄河楼开园时间和闭园时间调整公告亲爱的游客朋友们云开疫散,春光正好。滨州黄河楼景区定于2023年2月15日恢复开园。(景区每周闭馆时间调整为周二)。黄河楼参观须知1周三至次周一塞舌尔将推广多样性体验可持续旅游和康养水疗等主题产品2月6日起,全国旅行社及在线旅游企业经营中国公民赴有关国家出境团队旅游和机票酒店业务试点恢复。海岛游作为出境游里一个重要细分市场,是出境游恢复后最先开始复苏的一个领域。塞舌尔旅游部阿拉尔塔里木机场再添新航线阿拉尔往返库车阿拉尔塔里木机场再添新航线阿拉尔往返库车2月中旬的一天,阳光明媚,春风熙熙,随着一架蓝色大棕熊0502飞机平稳地落在阿拉尔塔里木机场,标志着阿拉尔塔里木机场再添一条短途运输航线。据幼儿园孩子要不要学识字?语文教师说很有必要,但要用对识字方法萌娃成长记双减之后,教育部明确禁止幼儿园提前教孩子识字。很多家长都很焦虑孩子幼儿园不识字,上小学了跟得上吗?到底要不要识字?孩子多大开始识字比较好?怎样教孩子识字,才能记得牢?女儿盈利艰难亟待上市补血优必选新增港股上市整体协调人经济观察网记者李华清2月13日,港交所官网披露,深圳市优必选科技股份有限公司(以下简称优必选)修订上市整体协调人,由原来委托国泰君安证券作为整体协调人调整为新增中信里昂证券中信建投