一、基础知识
1.要了解java中的位运算,要先看看每种类型占多少位,见下图
2.要知道10进制的数字怎么转为2进制的010101组合的,只需要知道为1的位序号即可。从高位往低位去寻找。
已知整数a,如果2**n<a,并且2**n * 2>a,那么最高位就是n(从第0位开始计数),然后将a-2**n的余数进行同样的运算,一直到最后剩1或者0(不是奇数就是偶数),是1的话说明第0位是1,是0的话说明第0位是0.
例子:99=1*2**6 + 1*2**5 + 1*2**1 + 1* 2**0,故可以得到99数字用二进制表示,第0,1,5,6位是1,其他是0
用java写方法计算
public static int getBitNum(int num){
if(num == 0){
return -1;
}
if(num == 1){
System.out.println("为1的位置有: "+0);
return 0;
}
//根据对数换底公式 logx(y) =loge(y) / loge(x)可推出
int bNum= (int) (Math.log(num)/Math.log(2));
System.out.println("为1的位置有: "+bNum);
getBitNum((int) (num%(Math.pow(2,bNum))));
return bNum;
}
3.还需要知道运算符的优先级,可以看到移位运算符在算数运算符(* / + -)之后
优先级 | 运算符分类 | 结合顺序 | 运算符 |
由 高 到 低 | 分隔符 | 左结合 | . [] ( ) ; , |
一元运算符 | 右结合 | ! ++ -- - ~ | |
算术运算符 移位运算符 | 左结合 | * / % + - << >> >>> | |
关系运算符 | 左结合 | < > <= >= instanceof(Java 特有) = = != | |
逻辑运算符 | 左结合 | ! && || ~ & | ^ | |
三目运算符 | 右结合 | 布尔表达式?表达式1:表达式2 | |
赋值运算符 | 右结合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
二、位运算
1.位运算按照优先级排列如下
非(~)——> 左移(<<),右移(>>和>>>) ——> 与(&) ——> 异或(^) ——> 或(|)
2.位运算
注意:
由于数据类型所占字节是有限的,而位移的大小却可以任意大小,所以可能存在位移后超过了该数据类型的表示范围,于是有了这样的规定:
如果为int数据类型,且位移位数大于32位,则首先把位移位数对32取模,不然位移超过总位数没意义的。
如果为long类型,且位移位数大于64位,则首先把位移位数对64取模,若没超过64位则不用对位数取模。
如果为byte、char、short,则会首先将他们扩充到32位,然后的规则就按照int类型来处理
a.非(~)运算
各位上的值1变0,0变1,
例1:10进制数字99 ,非(~)运算后为100,如下图,计算,高位1为负,则有 ~99=-1*2**7 + 1*2**4 + 1*2**3 + 1*2**2=-100;
例2:10进制数-20 ,通过1变0,0变1得到,~-20=1*2**4 + 1*2**1 + 1*2**0=19;
由以上两个例子看出,~99=-99 - 1;~-20 = -(-20)-1,可以得到,对数a取反,-a = (~a)+1;
b.左移(<<)
在当前类型的数值范围内,没往左移动1位,得到的数值翻倍,移动n位,得到为a*2**n
c.右移(>>)
如下图,99>>1=49,99>>3=12,可以得到:数啊a右移n位,等于(int)(a/2**n)
d.无符号右移(>>>)
无符号右移是不管正负数都在高位补0,如果是正数,那么规则和带符号右移(>>)相同,如果是负数,来看一下下图,
e.与运算(&)
相应的位置上都是1,结果才是1,否则为0,即1&0=0;0&1=0,;0&0=0;1&1=1.。
例子:判断数字的奇偶性,a&1=1,则a为奇数;a&1=0,则a为偶数
f.或运算(|)
两数进行或(|)运算,相应的位置有一个数字的值是1,则是1,否则是0,即1 | 1 = 1,1 | 0 = 1 ,0 | 1 = 1,0 | 0 = 0 ;
例子:可能在物联网等数据传输后接收方需要按某种规则操作后才能解析,如将接收到的数字a的第n位变成1,那么可以如下:
b = a | (1 << n);(将a数字的第n位变成1)。
g.异或运算(^)
相应位相同为0,不同为1,即 0 ^ 0 = 0, 1 ^ 1 = 0; 0 ^ 1 = 1, 1 ^ 0 = 1;
例子1:0异或任何数值为任何数,a ^ 0 = a;
例子2:不用第三个变量交换两个变量x,y的值,
x ^= y; y ^= x; x ^= y; 如下图,3种颜色分别代表三次异或(^)运算的过程
ok,今天的分享就到这里,如有不对之处欢迎指正!