package day;
//5、位运算符(7个):实例
public class Test_10 {
public static void main(String[] args) {
// 【位移运算符(7个)之第1个】: <<左移】 移动N位就是乘以2的移动数次幂
System.out.println(12 << 2);// 1100 = 110000 = 32+16= 48
/*
* 3<<2 读法:将3向左移动2位
* 1.先把3的转二进制:0011
* 2.左移两位0,右边补齐两个0:1100
* 3.把二进制换十进制:
* 根据8421原则:(二进制1 对应8421下的值相加,只计算二进制1的值)
* 1 1 0 0
* 8 4 2 1
* -------------
* 结果是:8+4=12,所以3<<2=12
*
* 3<<4 读法:将3向左移动4位
* 1.先把3的转二进制:0011
* 2.左移两位0,右边补齐两个0:0011 0000化为110000
* 3.把二进制换十进制: 根据8421原则:(二进制1
* 对应8421下的值相加,只计算二进制1的值)
* 1 1 0 0 0 0
* 32 16 8 4 2 1
* --------------------------
* 结果是:32+16=48,所以3<<4=48
*
*/
// 【位移运算符(7个)之第2个: >>右移】 移动N位就是除以2的移动数次幂
System.out.println(5>>2);//5的二进制=101 5/2(1) 2/2(0) 余数1(1)
//101右边= 01划走,左边是最高位是0,因此左边补2个0 0001,0001换成十进制是1 ,1/1=1
System.out.println(-5>>2);
System.out.println("-16带符号右移2:"+(-16>>2));
//16的二进制=10000,10000>>>2位=00 100=也就是100,100(根据8421,1x4=4)的二进制=4
//正的已知(16>>2)=4,加回负号,即(-16>>2)=-4
// 【位移运算符(7个)之第3个: &按位与】
System.out.println(5&9);//5的二进制=0101,9的二进制=1001
//0101&1001= 0001 转十进制=1 根据&的Boolean原则:真真为真 有假必假 11=1;有0=0
// 【位移运算符(7个)之第4个: |按位或】
System.out.println(5|9);//5的二进制=0101,9的二进制=1001
//0101|1001=1101转十进制=8+4+1=13 根据|的Boolean原则:假假为假 有真必真 00=0;有1=1
// 【位移运算符(7个)之第5个: ~取反】(取反加1)-6+1=-7
System.out.println(~6);//6的二进制是110,2/6(0) 3/2(1) 余1
//~110 =001
// 【位移运算符(7个)之第6个: ^按位异或】 一个数异或同一个数两次,还是那个数
System.out.println(5^9);//5的二进制=0101,9的二进制=1001
//0101^1001= 1100=8+4=12 根据^的Boolean原则:相同为假 不同为真
//^异或的特点: 一个数据对另一个数据位异或两次 该数本身不变
System.out.println(7^4^4);
/*7^4^4=111^011^011=7
分解:
111^011= 100
100^011=111=7
------------------------------
System.out.println(5^10^10);
5^10^10=0101^1010^1010=5
分解:
0101^1010=1111
1111^1010=0101=5
----------------------------
System.out.println(5^10^5);
5^10^5=0101^1010^0101=10
分解:
0101^1010=1111
1111^0101=1010=10 */
// 【位移运算符(7个)之第7个:>>>:(无符号右移运算符)】
System.out.println("16无符号右移2:"+(16>>>2));
//16的二进制=10000,10000>>>2位=00 100=也就是100,100(根据8421,1x4=4)的二进制=4
System.out.println("-16无符号右移2:"+(-16>>>2));
}
//5、位运算符(7个):实例
public class Test_10 {
public static void main(String[] args) {
// 【位移运算符(7个)之第1个】: <<左移】 移动N位就是乘以2的移动数次幂
//二进制转十进制:8421原则(128 64 32 24 16 8 4 2 1)
System.out.println(12 << 2);// 1100 = 110000 = 32+16= 48
/*
* 3<<2 读法:将3向左移动2位
* 1.先把3的转二进制:0011
* 2.左移两位0,右边补齐两个0:1100
* 3.把二进制换十进制:
* 根据8421原则:(二进制1 对应8421下的值相加,只计算二进制1的值)
* 1 1 0 0
* 8 4 2 1
* -------------
* 结果是:8+4=12,所以3<<2=12
*
* 3<<4 读法:将3向左移动4位
* 1.先把3的转二进制:0011
* 2.左移两位0,右边补齐两个0:0011 0000化为110000
* 3.把二进制换十进制: 根据8421原则:(二进制1
* 对应8421下的值相加,只计算二进制1的值)
* 1 1 0 0 0 0
* 32 16 8 4 2 1
* --------------------------
* 结果是:32+16=48,所以3<<4=48
*
*/
// 【位移运算符(7个)之第2个: >>右移】 移动N位就是除以2的移动数次幂
System.out.println(5>>2);//5的二进制=101 5/2(1) 2/2(0) 余数1(1)
//101右边= 01划走,左边是最高位是0,因此左边补2个0 0001,0001换成十进制是1 ,1/1=1
System.out.println(-5>>2);
System.out.println("-16带符号右移2:"+(-16>>2));
//16的二进制=10000,10000>>>2位=00 100=也就是100,100(根据8421,1x4=4)的二进制=4
//正的已知(16>>2)=4,加回负号,即(-16>>2)=-4
// 【位移运算符(7个)之第3个: &按位与】
System.out.println(5&9);//5的二进制=0101,9的二进制=1001
//0101&1001= 0001 转十进制=1 根据&的Boolean原则:真真为真 有假必假 11=1;有0=0
// 【位移运算符(7个)之第4个: |按位或】
System.out.println(5|9);//5的二进制=0101,9的二进制=1001
//0101|1001=1101转十进制=8+4+1=13 根据|的Boolean原则:假假为假 有真必真 00=0;有1=1
// 【位移运算符(7个)之第5个: ~取反】(取反加1)-6+1=-7
System.out.println(~6);//6的二进制是110,2/6(0) 3/2(1) 余1
//~110 =001
// 【位移运算符(7个)之第6个: ^按位异或】 一个数异或同一个数两次,还是那个数
System.out.println(5^9);//5的二进制=0101,9的二进制=1001
//0101^1001= 1100=8+4=12 根据^的Boolean原则:相同为假 不同为真
//^异或的特点: 一个数据对另一个数据位异或两次 该数本身不变
System.out.println(7^4^4);
/*7^4^4=111^011^011=7
分解:
111^011= 100
100^011=111=7
------------------------------
System.out.println(5^10^10);
5^10^10=0101^1010^1010=5
分解:
0101^1010=1111
1111^1010=0101=5
----------------------------
System.out.println(5^10^5);
5^10^5=0101^1010^0101=10
分解:
0101^1010=1111
1111^0101=1010=10 */
// 【位移运算符(7个)之第7个:>>>:(无符号右移运算符)】
System.out.println("16无符号右移2:"+(16>>>2));
//16的二进制=10000,10000>>>2位=00 100=也就是100,100(根据8421,1x4=4)的二进制=4
System.out.println("-16无符号右移2:"+(-16>>>2));
//-16无符号右移2:1073741820,为什么负的无符号右移这么大的?
百度答案:负数十进制转二进制:换成二进制后 取反 加1
“ 0000 0101”在十进制中表示“5”,将这个二进制数(源码)转换为反码就是
“1111 1010”而它的补码就是在反码的个位上加1为“1111 1011” 这个补码的十进制数为“-5”
}}