JAVA位运算符之简要说明

首先要了解各个进制数之间的转换

 例如:

         十进制数    ->  二进制数
         0  ->  0
         1   ->  1
         2   ->  10
         3   ->  11
         4   ->  100


举例(计算机字长为8为列):
十进制数5:

原码: 0000 0101
反码:正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反

         0000 0101

补码:正数的补码与其原码相同,负数的补码为其反码在最低位加1

         0000 0101

 

十进制数  -5:

原码: 0000 0101
反码: 1111 1010

补码: 1111 1011


位与(&)
运算规则:一真一假即为假,两假为假,两真为真。

 

 例:0&0=0;   0&1=0;    1&0=0;     1&1=1;

 

	//0 1 10 11 100 101 110 111 1000 1001
	//0 1 2  3   4   5   6   7    8   9

	int a = 5;//0 0101
	int b = 6;//0 0110
	//-----------------------------------
		     //0 0100
	System.out.println(a&b);
	//结果为4

	//判断int型变量a是奇数还是偶数 
	//偶数的最后一位都是0  0&1 =》为0 所以结果只有0和1两个值
	//a&1  = 0 偶数 
      	//a&1  = 1 奇数
	
	// & 和 &&
	//前面是位运算符 ,后面是逻辑运算符。对于A&B,不管A是否为假,仍然要判断B。而A&&B 第一个不成立就不会去判断第二个了
	
	if(a==b&b==c){
	}
	//用&的话 程序会先判断a是否=b 如果不等于. 还要跳过判断b是否=c.
	
	if(a==b&&b==c){
	}
	//&&的话..程序判断a!=b的话 直接后面的b是否=c就不做判断了




位或(|)
运算规则:有真则真,两假为假。

 

例:0|0=0;   0|1=1;   1|0=1;    1|1=1;

	//0 1 10 11 100 101 110 111 1000 1001
	//0 1 2  3   4   5   6   7    8   9

	int a = 5;//0 0101
	int b = 6;//0 0110
	//-----------------------------------
		     //00111
	System.out.println(a|b);
	//结果7
	
	// | 和 ||
	//前面是位运算符 ,后面是逻辑运算符。对于A|B,不管A是否为假,仍然要判断B。而A||B 第一个成立就不会去判断第二个了



位异或(^)
运算规则:0^0=0;   0^1=1;   1^0=1;   1^1=0

 

	//0 1 10 11 100 101 110 111 1000 1001
	//0 1 2  3   4   5   6   7    8   9

	int a = 5;//0 0101
	int b = 6;//0 0110
	//-----------------------------------
		     //0 0011
	System.out.println(a^b);
	//结果3



//不用第三变量,交互两个数的值
 public static void swap(){
	int a = 4;   
	int b = 2;    
	a ^= b;  //a = a^b;   a = 1
	b ^= a;  //b = b^a;   b = 4
	a ^= b;  //a = a^b;   a = 2;
	System.out.println("a="+a+"         "+"b="+b);
    }



位非(~)
运算规则:~1=0;   ~0=1;

	//0 1 10 11 100 101 110 111 1000 1001
	//0 1 2  3   4   5   6   7    8   9
	
	int a = 5;//0000 0000 0000 0101
	
	//-----------------------------------
		  //1111 1111 1111 1010  这是-6
	System.out.println(~a);
	//结果为 -6



右移(>>)

例如:a = a >> 3 将a的二进制位右移3位(将2转为2进制再进行位移)

2 => 10
右移两位
0010 => 0000  为0

3 => 11
右移一位
0011 => 0001  为1

无符号右移(>>>)
不管是正数还是负数左边都补0



左移(<<)

例如:a = a << 3 将a的二进制位左移3位

2 => 10
左移两位
0010 => 1000  为8

3 => 11
左移一位
0011 => 0110  为6


int  mulTwo( int  n){ //计算n*2    
    return  n<<1;  
}  

int  divTwoPower( int  n, int  m){ //计算n/(2^m)   
    return  n>>m;  //除以2的m次方
}  

//求两个数的平均值
int  getAverage( int  x,  int  y){  
        return  (x+y) >>  1 ;   //将两个数的和右移一位 也就是除以2
}  




二进制数10的十进制数为2,二进制数100的十进制数为4,以此类推,
可见十进制数的两倍这是二进制数左移了一位,
所以除以2的话就是右移1位了,如果要除以4 也就是 2*2 那就右移两位,以此类推。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值