首页 > 其他分享 >二进制加法运算小技巧

二进制加法运算小技巧

时间:2023-06-17 17:01:39浏览次数:42  
标签:需要 运算 二进制 int 异或 加法 进位

二进制加法

  • 位运算回顾 & (位与) : 都为1 结果为 1 否则为 0 | (位或) : 都为0 结果为 0 否则为 1 -- 有 1 结果就是 1 ^ (异或) : 相同为 0 不同为 1 ~(取反) : 0变1 1变0
  • 二进制加法运算 以 7 + 8 = 15 为例 即: 111
  • 1000 = 1111 关键点:涉及到进位操作该如何处理 如 1111 + 111 = ?

详细运算过程总结

  1. 首先考虑需要进位的情况,在二进制运算中 1 + 1 需要进行进位。
  1. 首先进行 异或 ^ 运算,获取无需进位的二进制数
1 1 1 1
^
0 1 1 1
=
1 0 0 0
  1. 这个时候拿到的结果,对应二进制数的等于1的位是不需要进位的
  2. 然后考虑需要进位的情况,什么样的情况需要进位?都为1的情况
1 1 1 1
&
0 1 1 1
=
0 1 1 1
  1. 此时需要进位对应的二进制数是0 1 1 1
  1. 那么此时该如何计算?
原始需要进行计算的两个数

---a:1 1 1 1
---b:0 1 1 1

异或结果
--- 1 0 0 0

位与结果:记为 x
--  0 1 1 1


很显然对于二进制的加法运算,需要进位的对应二进制位需要向左移一位
即    x << 1
得到  1 1 1 0

接下来操作已经得到的   异或结果  和  需要进位的二进制位  进行异或运算
即
1 0 0 0
^
1 1 1 0
=
0 1 1 0
此时得到的结果是最终需要保留的进位1

进行位与运算
1 0 0 0
&
1 1 1 0
=
1 0 0 0 << 1 = 1 0 0 0 0

然后
1 0 0 0 0
^
0 1 1 0
=
1 0 1 1 0 = 22 = a + b = 15 + 7 = 22

二进制加法总结

  1. 首先通过两个数的异或运算得到一个二进制数,该数字如果不为0,其对应二进制位 等于1的位置表示该位不需要进位
  2. 通过两个数进行位与运算,得到一个二进制数,该数字如果不为0,其对应二进制位 等于1的位置表示需要进行进位的位置,所以让其向左移动一位
  1. 然后利用此时得到的数 与 步骤一运算得到的数 进行 异或运算——得到需要最终保留的二进制位数 记为结果 A
  2. ............................................................................. 进行 位与运算——得到最终需要进位的二进制数,需要进位的二进制数,很显然需要向左移动一位 记为结果 B
  3. 此时最终 A ^ B 即为最终结果.
public int twoSum(int a, int b) {
    while(b != 0) {
        int ans = a ^ b;
        int curry = a & b << 1;
        a = ans;
        b = curry;
    }
    return a;
}

标签:需要,运算,二进制,int,异或,加法,进位
From: https://blog.51cto.com/u_16079703/6505481

相关文章

  • Vue全局过滤器的使用以及在template三元运算符中内使用过滤
    新建filters.js如下,内容过滤可以自己写函数,记得export导出importdayjsfrom"dayjs";//转小写letlower=value=>value.toLowerCase();//转大写letupper=value=>value.toUpperCase();letcurrencyStyle=(value,style)=>{//货币格式/***sty......
  • C++面试八股文:在C++中,你知道哪些运算符?
    C++面试八股文:在C++中,你知道哪些运算符?某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:面试官:在C++中,你都知道都哪些运算符?二师兄:啥?运算符?+-*/=这些算吗?面试官:嗯,还有其他的吗?二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。面试官:好的。那你知道这些运算......
  • [学习笔记] 位运算
    〇、基础位运算与运算/AND语法:a&b。计算方法:按位计算AND。运算:1&1=1,1&0=0,0&1=0,0&0=0。或运算/OR语法:a|b。计算方法:按位计算OR。运算:1|1=1,1|0=1,0|1=1,0|0=0。异或运算/XOR语法:a^b。计算方法:按位计算XOR。运......
  • 位运算与集合
    前言在刷LeetCode的时候,我们常常碰到需要枚举同时选择几个元素,或者说枚举选择一个集合的情况,即同时选择$\lbrace0,1,2\rbrace$或者$\lbrace0,1,3\rbrace$等,这里集合中的数字表示要选择的元素的索引。通常情况下,我们往往会使用哈希表来表示集合,好处在于可以方便的在$O(......
  • 二进制文件安装mysql5.7
    yum安装mysql5.7虽然方便,但是安装的路径和配置难以定制化,这边使用二进制安装,即使用官方提供的编译软件包来安装,不需要额外准备依赖的环境软件,安装也会变的更加轻量,且可以定制化。一、自定制规范Mysql本身没有明确的安装规范,但是日常工作中为了便于管理和定位问题,我们需要对Mysql......
  • 统计出整形数值二进制位里面包含的1的个数
    /*printfexample*/#include<stdio.h>intcount_one(intn){intcount=0;while(n){n=n&(n-1); count++;}returncount;}intmain(){inta=-1;printf("%d",count_one(a));return0;} 结果: ......
  • oracle统计出正整数对应二进制的里面1的位数
    declarennumber:=15; count1int:=0;begin whilen<>0 loop n:=bitand(n,n-1); count1:=count1+1; endloop; dbms_output.put_line(count1); end;结果为:   对于负数oracle似乎处理不了,正整数没问题。......
  • linux服务器mysql的简单安装和使用(基于二进制文件方式)
    mysql下载地址https://downloads.mysql.com/archives/community/版本选择 直接放置/root目录下     常规操作查找以前是否装有mysqlrpm-qa|grep-imysql如果找到或者以前安装过有遗留文件,操作如下命令删除命令:rpm-e--nodeps包名删除老版本m......
  • 二进制安装Tomcat
    注意:安装tomcat前必须先部署JDK[root@centos8~]#wgethttp://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz[root@centos8~]#wgethttps://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.88/bin/apache-tomc......
  • 二进制安装ZABBIX-server
    #wgethttps://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu22.04_all.deb#dpkg-izabbix-release_6.0-4+ubuntu22.04_all.deb#aptupdate安装Zabbixserver,Web前端,agent#aptinstallzabbix-server-mysqlzabbix-fron......