5、位运算符(7个):实例

来源:互联网 发布:图知科技 编辑:程序博客网 时间:2024/06/08 06:52
package day;
//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(3 << 2);// 0011 = 001100 = 8 +4 = 12
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”

}


}
原创粉丝点击