算法中很多情况下需要用到各种位运算的转换,比如>>右移、<<左移、&与等等,下面我们利用这些位运算来进行一个进制转换,将一个int整形(32位)十进制转二进制,以及其他的一些转换技巧。
目录
核心点就是将1进行左移操作,从高位32位开始依次向低位0位移动,分别与所需转换的整形数值做与运算
一、十进制转换成32位的二进制
核心点就是将1进行左移操作,从高位32位开始依次向低位0位移动,分别与所需转换的整形数值做与运算
一、代码:
public void printBinary(int num){
//高位从右到左遍历,打印
for(int i = 31; i >= 0 ; i--){
//数值第一轮是与高位1做与运算, 两者为1 与 得1,一个不为1 与 得 0
System.out.print(num & (1 << i) == 0 ? 0 : 1)
}
}
二、代码解析:
- 转换二进制,需要知道打印方向,从高位到低位,即从左往右依次打印
- &与运算的技巧, 1 1 得 1,非1 得 0,所以原数值,若为1 , 与运算后仍为 1, 若为 0, 与运算后仍为0
二、位运算技巧
一、随用随记的特殊技巧
System.out.println((~-5)+1); //5 -5的相反数为5 取反+1
System.out.println((~5)+1); //-5 5的相反数为-5 取反+1
System.out.println(-1>>>1); //2147483647 无符号右移,忽略最高位的符号位,即用0补齐最高位
System.out.println(-1>>1); //-1 带符号右移,负数最高位符号位是 1, 右移后仍用1补齐
printBinary(-1); //打印-1二进制 11111111111111111111111111111111
System.out.println(70 & 63); // 6 即num % 64 等价与 num & 63 因为64二进制是1000000 模64后余数就是后六位的二进制数, 取后6位的技巧,与运算 111111 即 63 与运算1 1得1 这样就得到num的余数了 所以等价于模
System.out.println(70 % 64); // 6
System.out.println( 2 ^ 2 ) ; // 0 自己异或自己为0,异或运算,相同为0 不同为1,相当于 无进位相加