神奇的位运算
学习本篇前,建议先看一下神奇的位运算(1)
题目描述:实现一个数的二进制中的奇偶位互换,如下:
这道题我们需要用到与运算(&)和或运算(^):
由图中的分析可得,我们需要两个辅助数,一个偶数位全为1,一个奇数位全为1,与偶数位全为1进行与运算,可以把原数中偶数位提取出来,与奇数位全为1进行与运算,可以把原数中奇数位提取出来,然后两个提取出的数移位再进行或运算便可以实现奇偶位互换。
package 位运算;
public class 奇偶位互换 {
public static void main(String[] args) {
int m=9;
System.out.println("原数:"+Integer.toString(m,2));
int ou=m&0xaaaaaaaa;//0xaaaaaaaa用8位十六进制表示32位二进制,一个a代表四位二进制1010
int ji=m&0x55555555;//0x55555555,一个十六进制5代表四位二进制0101
int n=(ou>>1)^(ji<<1);
System.out.println("互换后:"+Integer.toString(n,2));
}
}
题目描述:用二进制表示0到1间的浮点数,如果该数字无法用32位以内二进制表示,则打印ERROR。
这道题是关于二进制与浮点数小数点部分转换的题,与位运算关系不大,但也涉及到二进制,所以我们在这里简单讨论一下。
我们首先需要知道小数与二进制的转化规则,我们将其总结为乘2挪整:
package 位运算;
public class 二进制表示浮点数 {
public static void main(String[] args) {
double n=0.625;
StringBuilder str=new StringBuilder("0.");
while(n>0) {
double num=n*2;
if(num>=1) {
str.append('1');
n=num-1;
}else {
str.append("0");
n=num;
}
if(str.length()>34) {
System.out.println("ERROR");
return;
}
}
System.out.println(str.toString());
}
}