黑马软件工程师—位运算符练习 十进制的十六进制表现形式 及三元运算符

黑马程序员—位运算符练习 十进制的十六进制表现形式 及三元运算符

------- android培训、java培训、期待与您交流! ----------

 

class e//练习题 
{
	public static void main(String[] args) 
	{
		/*  一:
		如何最快的计算出2*8的结果 思路利用位运算 计算机的底层是
		二进制运算 所以可以利用左移的方法 这就是位运算高效的原因
		*/

		System.out.println(2<<3);//即2乘以2的3次幂 结果为16

		/*  二:
		如何对两个整数变量的值进行互换
		*/

		int m=2,n=3;
		

		/*  法一:
				借助第三方变量

		int  temp=n;
		     n=m;
			 m=temp;
		System.out.println("m="+m+",n="+n); //结果为m=3,n=2
		*/
		


		/*  法二: 
		      利用和的转换 开发中一般情况使用这种方法,比第三种更
		   直观,更容易想到,但是这种方法有个缺点,就是
		   int的范围问题,两个变量的和如果超过2的31次
		   方,则容易损失精度

		n=m+n;
		m=n-m;//要想m=3 则需要m和n的和减去原来的m
		n=n-m;//要想n=2 则需要m和n的和减去上式中的m 因为m已经是3了

		System.out.println("m="+m+",n="+n);//结果为m=3,n=2
		*/


		/*  法三: 
		        借助异或 ^ (这个方法不容易想到)
		*/

		n=n ^ m;
		m=n ^ m;//相当于m=n ^ m ^ m  此时m已经等于int中的n值了 即m=3
		n=n ^ m; /*
				   此时等式后面的n仍是n=n^m中的左数第一个n,但是m已经变为
				   上式中的m了 即m=n^m^m,所以最后n的结果为n=(n^m) ^ (n^m^m)
				   相当于从右往左看m^(m^n)^(m^n)所以最后还是m值 即 m=2
				 */
		System.out.println("m="+m+",n="+n);//结果为m=3,n=2

		System.out.println((char)67);

	}
}

 

class weiyi //练习2 位移的应用 十进制的十六进制表现形式 及三元运算符
{
	public static void main(String[] args) 
	{

		//System.out.println(Integer.toBinaryString(60));
		//System.out.println(Integer.toHexString(60));
		
		/*
		二 问题:如何获得60的十六进制位的表现形式 ?
		思路:先获取60的二进制形式的最低4位,通过&15(即二进制位 1111 )
		*/
		
		int num = 60;
		int n1 = num & 15;
		//System.out.println((char)(n1-10+'A'));

		/*
		结果为c 即答案的倒数第一位(后期有更简单的方法) n1-10是为了看出最后一位
		比10多几位,因为16进制满9就进了 没有10,所以利用ASCII码表的字符具有数字
		代表的功能得出最低位应该是什么 如下:

		0-9 'A' 'B' 'C' 'D' 'E' 'F'
			65   66  67
			10   11  12  13  14  15

			12 - 10 = 2 + 'A' = (char)67;
		*/    
			

		//接着 要获取下一组四位,则将60右移4位。

		int temp = 60>>> 4;

		/*
		为什么要用无符号右移 因为如果出现负数的情况 则右移后高位会被1补齐 则变
		成死循环了 所以要用无符号右移
		*/

		//接着 对temp的值进行最低四位的获取。

		int n2 = temp & 15;
		//System.out.println(n2);//结果为3 即答案的倒数第二位  最终答案为60=3c

		/*
		上述的 int n1 = num & 15;
		System.out.println((char)(n1-10+'A')); 中我们实际并不知道n1与9的大小关
		系 所以应该是这样写 利用马上要学的三元运算符 示例如下:
		*/

		int x=3,y;
			y=(x>1)?100:200;
		System.out.println("y="+y);

		//同理 我们可以完善上面的做法

		System.out.println(n1>9?(char)(n1-10+'A'):n1);

		/*
		注意 ? : 与后期的语句相像 因为是运算符 所以一定有结果 而且如果100换成
		字符型比如说'a' 因为'a'会与200进行运算 所以会自动进行提升 就出现67而不
		是c的情况了 结果是67了.吼吼...老师说以后自己写一个代码对一个整数进行16
		进制形式获取的时候,再会讲到
		*/

		System.out.println(n2>9?(char)(n1-10+'A'):n2);

		/*
		想要知道一个整数的二进制表现形式的时候,也可用上述方法
		二进制就是& 1    再右移1位
		八进制就是& 7    再右移3位
	    十六进制就是&15  再右移4位
		*/
	}
}