算法中很多情况下需要用到各种位运算的转换,比如>>右移、<<左移、&与等等,下面我们利用这些位运算来进行一个进制转换,将一个int整形(32位)十进制转二进制,以及其他的一些转换技巧。
一、十进制转换成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
二、计算演练
一、负数二进制,计算转换得到其十进制:
例如计算机中二进制:11111111111111111111111111111011 ,表示的十进制为 -5 ,计算机内存中保存的都是补码,这个要清楚。
首先符号位即最高位为1,表示为负数,那是负几,就将存数位(即去符号位后的31位)取反,再加1,得到的就是负数的相反数,前面有提到,~(-5)+1=5,得到了相反数后,再加上符号-,即位该二进制对应的十进制:
(符号位)1 1 1 1... 1 1 0 1 1
操作1:存数位取反 1 0 0 0... 0 0 1 0 0
操作2:存数位+1 1 0 0 0... 0 0 1 0 1
这里得到的二进制,转换十进制 2^2+2^0 = 5,加入符号位,得到 -5