示例
问题一:如何不用任何中间变量,交换两个整数?
方法一:使用常规方法
public class BitSwitch
{
public static void main(String[] agrs)
{
//交换两个数,不用中间变量
int a=100,b=200;
System.out.println("a= "+a);
System.out.println("b= "+b);
//交换过程
a=a+b;//把a+b=200,赋予a,此时a=300,b=200;
b=a-b;//把a-b=300-200=100,赋予b,此时a=300,b=100
a=a-b;//把a-b=300-100=200,赋予a,此时a=200,b=100
System.out.println("Switch : a= "+a);
System.out.println("Switch : b= "+b);
/*输出
a= 100
b= 200
Switch : a= 200
Switch : b= 100
*/
}
}
方法二:使用位运算
public class BitSwitch
{
public static void main(String[] agrs)
{
//交换两个数,不用中间变量
int a=3,b=5;
System.out.println("a= "+a);
System.out.println("b= "+b);
//交换过程
a=a^b;//a^b目的是保存了a和b的差异位
b=b^a;//将b中有差异的位翻转,这样b=3
a=a^b;//原始a中有差异的位翻转(变成b)然后赋值给a=5
System.out.println("Switch : a= "+a);
System.out.println("Switch : b= "+b);
/*输出
a= 3
b= 5
Switch : a= 5
Switch : b= 3
*/
}
}
问题二:如何将int型转换二进制,十六进制输出?
1.进行二进制输出
public class Binary
{
public static void main(String[] agrs)
{
//1.用位运算将20010输出二进制
int a=20010;
for(int i=0;i<32;i++)
{
//,方法一:利用 >>(右移先输出左边第1位,在第2位..依次到最后
//System.out.print(a>>(31-i)&1);
/*方法二:
System.out.print(a<<(i)&1);
不能使用这个,a左移的话右边全部补0,所以全部输出0;
*/
//方法三:把1左移动,然后高位比较,不为0要输出1
int flag=a&(1<<(31-i));
System.out.print(flag==0?0:1);//用三目运算符判断
}
}
}
2.十六进制输出
public class Binary
{
public static void main(String[] agrs)
{
//1.用位运算将20010输出十六进制
int a=20010;
//i=28,第一次右移28位,第二次移动24位。
for(int i=28;i>=0;i-=4)
{
//temp为移位后的临时变量
int temp=20010>>i;
//用15(1111)进行&运算,得到四位的数范围0~15
temp=temp&15;
char ch;
//把大于9的表示为ABCDEF,小于的0~9表示
if(temp>9)
{
ch=(char)('A'+(temp-10));
}
else
{
ch=(char)('0'+temp);
}
System.out.print(ch);
/*输出:00004E2A
*/
}
}
}
问题三:如何计算一个实数二进制中1的个数?
思路: 在讲述具体实现时,来看这样一个事实: n&(n-1)能实现将最低位的1翻转 !比如说n=108,其二进制表示为01101100,则n&(n-1)的结果是01101000。因此只要不停地翻转n的二进制的最低位的1,每翻转一次让计数器+1,直到n等于0时,计数器中就记录了n的二进制中1的位数。
public class Binary
{
public static void main(String[] agrs)
{
//1.位运算计算实型中1的个数
long a=12345625;
int flag=0;
//当a不为0,则执行循环。
while(a!=0)
{
flag++;
//a&(a-1),能将最低位1反转为0,所以反转一次,用flag记录一次;
a&=(a-1);
}
System.out.println(flag);
}
}