专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java运算符之位运算运算符并举例说明

temp10 2024-09-27 02:49:40 java教程 9 ℃ 0 评论

#挑战30天在头条写日记#

运算符分类:

Java运算符之位运算运算符并举例说明

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符
  4. 逻辑运算符
  5. 位运运算符
  6. 三目运算符

位运算运算符

 注意:要做位运算,首先要把数据转换为二进制
	(使用的是补码)
	     
	位运算符:
	&(有0则0) , | (有1则1) ,
	^(相同则0,不同则1) ,  ~(0变1,1变0) ,
	<<(左移) , >>(右移)  ,  >>>(无符号)

位运算例子

class YunSuan{
	public static void main(String[] args){
		int a = 3;
		int b = 4;
		System.out.println(3 & 4);//输出结果0
		System.out.println(3 | 4);//输出结果7
		System.out.println(3 ^ 4);//输出结果7
		System.out.println( ~3);//输出结果-4
		
	/* 分析:
	   3的二进制
	   00000000 00000000 00000000 00000011
	   4的二进制
	   00000000 00000000 00000000 00000100
	   &位运算:有0则0.
	   00000000 00000000 00000000 00000011
	  &00000000 00000000 00000000 00000100
	  -------------------------------------
	   00000000 00000000 00000000 00000000
	   结果是:0
	   |位运算:有1则1
	   00000000 00000000 00000000 00000011
	  |00000000 00000000 00000000 00000100
	  -------------------------------------
	   00000000 00000000 00000000 00000111
	   结果是:7
	   ^位运算符:相同则0,不同则1
	   00000000 00000000 00000000 00000011
	  ^00000000 00000000 00000000 00000100
	  -------------------------------------
	   00000000 00000000 00000000 00000111
	   结果是:7
	   ~位运算:0变1,1变0
	   00000000 00000000 00000000 00000011
	  ~11111111 11111111 11111111 11111100
	  补码:11111111 11111111 11111111 11111100
	  反码:11111111 11111111 11111111 11111011
      原码:10000000 00000000 00000000 00000100 
	  结果是:-4   
	*/
	}
}	
^位的特点:一个数据对另一个数据异或(^)两次,该数据本身不变
例子:
class YunSuan{
	 public static void main(String[] args){
		 int a = 10;
         int b = 20;
         System.out.println( a ^ b ^ b );//	10
         System.out.println( a ^ b ^ a );//	20	 		 
	 } 
 } 
 	<<:左移 左边最高位丢弃,右边补齐0
	>>:右移  最高位是0,左边补1 最高为位是1左边补1
	>>>无符号:无论最高位是0还是1,左边补齐0
例子:
 class YunSuan{
	public static void main(String[] args){
		//<<把<<左边的数据*2的移动次幂
		System.out.println( 3 << 2 );//输出结果:3*2^2=12
		//>> 同理把>>左边的数据除以2的移动次幂
		System.out.println(24 >> 2);//输出结果:24/2^2=6
		System.out.prinyln(-24 >> 2);//输出结果:-24/2^2=-6
		System.out.println(-24 >>> 2);//输出结果:1073741818
		/* 
		( 3 << 2 )意思:计算出三的二进制,再向左移动两位丢弃,右边补0,<<的移动 计算出3的二进制
		00000000 00000000 00000000 00000011
  (00)00000000 00000000 00000000 00001100
		>>的移动  计算-24的二进制:
		原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000
              1111111111 11111111 11111111 111010(00)
		
        补码:1111111111 11111111 11111111 111010(00)
        反码:1111111111 11111111 11111111 111001
		原码:1000000000 00000000 00000000 000110
		>>>的移动	计算-24的二进制:	
		原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000
		      0011111111 11111111 11111111 111010(00)
		
		补码:0011111111 11111111 11111111 111010(00)
		反码:0011111111 11111111 11111111 111010(00)
		原码:0011111111 11111111 11111111 111010(00)
		结果:1073741818
		*/
	}
}    

例题:

  1. 请自己实现两个数的变量交换 。
  2. 请用最有效率的方式计算出2乘以8的结果?

例题一解决方法:

class yunsuan{
	 public static void main(String[] args){
		 int a = 10;
		 int b = 20;
		 System.out.println("a:"+a)
		 System.out.println("b:"+b)
方法一:使用第三变量
		 int c = a;
		 a = b;
		 b = c;
		 System.out.println("a:"+a)
		 System.out.println("b:"+b)
		 //输出结果:a:20 b:10
方法二:用位异或运算
		 a=a^b;
		 b=a^b;//a^b等于a^b^b=a		 
		 a=a^b;//a^b等于a^b^a=b
		 方法三:
		 a=a+b;//a=30
		 b=a-b;//b=10
		 a=a-b;//a=20
 方法四:一句话搞定
		 b=(a+b) - (a=b);//b=30-20=10 a=20
		 System
	 }
 }

例题二解决方法:

class YunSuan{
	public static void main(String[] args){
		System.out.println(2*8);
		System.out.println(2 << 3);
	}
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表