Java菜鸟学习笔记--语法篇(五):位运算实例

示例



问题一:如何不用任何中间变量,交换两个整数?



方法一:使用常规方法


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);
	}

}




作者:YangGan
本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan (包含链接).

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值