所有的数据在计算机中都以二进制的形式存储,对二进制的运算叫做位运算,即符号位共同参与运算的运算。
基本形式:
& 与:仅当两个位都为1时,结果为1;
| 或 :两个位有一个位为1时,结果就为1,仅当两个位都为0时,结果为0;
~ 非 :位为0,结果为1,位为1,结果为0;
^ 异或:两个位相同为0,不同为1;
<< 左移:二进位全部左移若干位,高位丢弃,低位补0(因为十进制左移一位相当于乘10,所以二进制左移一位相当于十进制的乘2);
>> 右移:各二进位全部右移若干位,对无符号数,高位补0,对于有符号数,算数右移需要补1,逻辑右移需要补0;
利用位运算实现加减乘除:
代码如下:
public int aplusb(int a, int b) {
// write your code here
//1.判断加数是否为0;
if (b==0) {
return a;
}
//2.求出不考虑进位的得数
int sum =a^b;
//3.求出只考虑进位的得数
int carry=(a&b)<<1;
//递归
return aplusb(sum, carry);
}
public int minus(int a,int b){
/*/
计算机中并没有单独的设置一个减法器,而是通过转换刚才的加法器来实现减法
而所谓的减法就是加一个负数,实现方案是取反加一
*/
//1.调用加法器,加数转换为负数 ~:按位取反,
int subtractor=aplusb(~b, 1);
int result =aplusb(a, subtractor);
return result;
}
public int multiply(int a,int b){
//去两个乘数的绝对值
int multiplicand =a<0?aplusb(~a,1):a;
int multiplier =b<0?aplusb(~b, 1):b;
int result = 0;
//对于乘法而言,不过就是加上多少次
for (int i=0;i<multiplier;i++){
result= aplusb(result, multiplicand);
}
//这里是判断结果的符号,负数不过是取反加一
if ((a^b)<0){
result=aplusb(~result, 1);
return result;
}
return result;
}
public int divide(int a,int b){
/*
相比于乘法,除法也不过是计算a-b减了几次罢了
*/
int dividend=a>0?a:aplusb(~a, 1);
int divisor=b>0?b:aplusb(~b, 1);
int i=0;
while (divisor<=dividend){
dividend=minus(dividend, divisor);
i=aplusb(i, 1);
}
if ((a^b)<0){
return aplusb(~i, 1);
}
return i;
}
以上,借鉴的很多