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
}
}
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位
*/
}
}