算法如何用位运算实现加减运算?
前言
本文主要介绍如何使用位运算来实现加减功能,也就是在整个运算过程中不能出现加减符号。
加减乘除运算在计算机中,实际上都是用位运算实现的,今天就用位运算来模拟下加法和减法的运算功能。思路分析
先分析如何用位运算实现加法运算。示例
假设a=23,b=36,使用位运算实现加法得到结果59。
首先来看下23、36、59的二进制信息。
从上面的图中可以看到,两个数相加的结果与两个数异或的结果很相似,只不过在图中的2位置相加的时候,产生了进位,而异或是没有进位的,如果能拿到进位信息,把两个数异或的结果和进位信息的结果相加就能得到最终结果了,那么如果能拿到进位信息呢?位运算进位
上图中,59的二进制信息可以分为两部分,0110011 和 0001000,再结合23、36的二进制信息来看,0110011为23和36的异或结果,而23和36相与的结果跟0001000很相似,只不过0001000中的1比相与结果往前移了一位。
于是,我们可以得出,两个数的二进制进位信息为两个数的相与在左移一位。初步结果
经过上面的分析,我们可以得到了一个初步的运算结果,即两个数相加等于两个数异或加上两个数的相与左移1位,也就是a + b = (a ^ b) + ((a & b) << 1)。
先用23和36来验证下。
经过验证可以看到,刚才得出的结论是正确的。
但是,我们要做到在整个运算过程中不能出现加号,接下来要想办法把这个加号给去掉。去除加号
还是以23和36为例,经过上面的运算我们把运算的位运算结果给化简下。
23 + 36 = (23 ^ 36) + ((23 & 36) << 1) = 51 + 8
也就是把23和36的相加运算转化为了51和8的相加运算,接下来继续分析51和8的相加运算,也是通过异或和相与进行操作。
51 + 8 = (51 ^ 8) + ((51 & 8) << 1) = 59 + 0
嗯?可以发现我们已经得出59了,而且还加了个0,加了个0不就相当于加了个寂寞嘛,可以直接省略啊。
由此,我们又可以得出一个结论,两个数的二进制进位信息为两个数的相与在左移一位,不停地循环这个过程,直到有一个数变为0,就能得到结果。整体思路
现在来总结下整体的计算过程:把两个数相加,拆分成两步,两个数异或加上两个数相与左移1位。判断相与左移的结果是否为0。如果相与左移为0,两个数异或的结果即为相加的结果。如果相与左移结果不为0,把得到的新结果,重复执行第1~3步操作。加法代码实现
经过上面的分析,来看下代码实现。public class Code19_Add { public static int add(int a, int b) { int sum = 0; while (b != 0) { sum = a ^ b; b = (a & b) << 1; a = sum; } return sum; } public static void main(String[] args) { int sum = add(23, 36); System.out.println(sum); } } 复制代码
运行程序,输出结果为59。减法实现减法分析
还是以23和36为例,如果要计算 36 - 23,该怎么办?
36 - 23 不就相当于36 + (-23),可以理解为加上一个负数,这就可以了吗?不不不,要求的是不能出现加减符号,-23里面是有减法这个符号的。
还记得前面我们分析的负数可以怎么表示吗?对了,负数是对一个数的取反再加1。嗯?又出现加号了,不过加法我们不是已经实现了吗?直接拿来用就好了。减法代码实现
有了加法操作,减法就很简单了,来看下代码。public class Code20_Sub { public static int add(int a, int b) { int sum = 0; while (b != 0) { sum = a ^ b; b = (a & b) << 1; a = sum; } return sum; } public static int sub(int a, int b) { return add(a, add(~b, 1)); } public static void main(String[] args) { int sum = sub(36, 23); System.out.println(sum); } } 复制代码
运行一下输出结果为13。
嗯,Perfect!
总结
本文主要介绍如何使用位运算来实现加减功能,至此功能都已经实现了。
那么问题来了,我们实现的加减运算与Java本身的加减相比,谁的效率更高呢?当然是Java中的更高了,因为我们是用Java实现的,代码运行后,要经过层层的翻译才能到达底层,所以效率肯定是有损失的。
当然我们的目的是熟悉位运算的操作,这个才是最重要的。
原文链接:https://juejin.cn/post/7183115929226575928
李文超武一帆算法侵害行为的事前规制与侵权救济研究李文超吉林大学法学院民商法博士研究生北京互联网法院审管办副主任四级高级法官武一帆北京互联网法院法官助理摘要本文从算法规制的本质主义理论和实用主义理论出发,引入技术层面的算法透明原则
降低民间投资融资成本!广东再推出9份政策组合拳,提振市场信心激发活力。3月20日,广东省政府新闻办举行新闻发布会,发布和解读新的助推市场主体高质量发展政策和措施。南都湾财社记者注意到,这9份政策覆盖民间
房价复苏,二手房正在崛起!买房的时候到了吗?前两天统计局公布数据,春节以来部分重点城市销售出现回暖迹象,销售数据恢复超过此前市场预期。究其原因,主要在于年前因疫情积压的部分置业需求释放,开发商集体回收部分折扣助推购房情绪上涨
硅谷银行在破产前提供给内部人员的贷款增加了两倍至2。19亿美元硅谷银行在破产前提供给内部人员的贷款增加了两倍至2。19亿美元财联社3月22日电,美国政府数据显示,硅谷银行在破产前,向该行高管董事和主要股东及其相关利益方提供的贷款在2022年最
2月份湖南全社会用电量同比增长10。1来源中国经济网中国经济网2月份,湖南全社会用电量为178。79亿千瓦时,同比增长10。1。其中,工业用电量83。06亿千瓦时,增长62。3。数据显示,12月,湖南全社会用电量为36
三孩免费读公办高中?催生政策要有诚意讲科学文和光三孩政策放开后,各地为了催生真是绞尽脑汁花样百出。有给钱的,像杭州等地就规定,给二孩家庭一次性发放5000元,三孩家庭一次性发放20000元还有给购房补贴的,四川绵阳就表示,
麻阳年产100万套服饰项目投产我们公司分两班生产,一天生产200多套校服,一个星期能生产1000多套漂亮产品。湖南恒达新材料科技有限公司生产厂长陈嘉祥手拿校服笑呵呵地说道。3月21日,湖南恒达新材料科技有限公司
15。81亿元资金今日流入通信股沪指3月22日上涨0。31,申万所属行业中,今日上涨的有20个,涨幅居前的行业为通信传媒,涨幅为3。512。66。通信行业位居今日涨幅榜首位。跌幅居前的行业为家用电器国防军工,跌幅
武汉大学邱春印课题组发PRL,拓扑声学新进展近日,物理评论快报(PhysicalReviewLetters)在线发表了武汉大学物理科学与技术学院邱春印教授课题组关于拓扑声学的研究新进展。论文题为UniversalMirror
月牙食金星,你见过吗?海报制作冯娟天文科普专家介绍,3月24日傍晚,一轮弯弯的月牙将与太阳系最明亮的行星在西南方天空上演一场奇妙的天象月掩金星。届时,金星将从月牙的缺口处被掩盖,从月牙的亮边缘复现,整个
分区控光峰值亮度惊人!TCL旗舰QDMiniLED电视来了21日,TCL推出新款QDMiniLED电视王炸组合。领曜QDMiniLED电视X11G以及最新款MiniLED电视Q10GPro。作为年度旗舰产品,TCLX11G是全球第一台XD