java 简单认识移位运算符和位运算符

移位运算符和位运算符本质上都是操作二进制位,因为计算机存储的是二进制数据,运算效率相对较高。

移位运算符:把整数的二进制位进行左移或右移 .左移一位,相当于这个数乘以2, 右移一位,相当于这个数除以2

/*
移位运算符
    把整数的二进制位进行左移或右移
    按位左移 <<    , 右侧补0,
    按位右移 >>,  左侧补符号位(最高位)
    无符号按位右移>>>,  左侧补0
*/
class Demo07 {
    public static void main(String[] args)     {
        int xx = 20;
        System.out.println( xx << 1 );        //40
        /* x在内存中的二进制形式为:
            0000 0000 0000 0000 0000 0000 0001 0100
            xx<<1 左移一位
          0 0000 0000 0000 0000 0000 0000 0010 1000         
        */

        System.out.println( xx >> 1 );        //10
        /* x在内存中的二进制形式为:
            0000 0000 0000 0000 0000 0000 0001 0100
            xx>>1 右移一位, 左侧补0
            0000 0000 0000 0000 0000 0000 0000 1010 0        
        */

        xx = -20;
        System.out.println( xx << 1 );        //-40
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1110 1100
            xx<<1 左移一位
          1 1111 1111 1111 1111 1111 1111 1101 1000        
        */
        System.out.println( xx >> 1 );        //-10
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1110 1100
            xx>>1 右移一位, 左侧补1
            1111 1111 1111 1111 1111 1111 1111 0110        
        */

        //左移一位,相当于这个数乘以2, 右移一位,相当于这个数除以2

        xx = -11;
        System.out.println( xx << 1 );        //-22
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1111 0101
            xx<<1 左移一位
          1 1111 1111 1111 1111 1111 1111 1110 1010        
        */

        xx = -13;
        System.out.println( xx << 1 );        //-26
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1111 0011
            xx<<1 左移一位, 右侧补0 
          1 1111 1111 1111 1111 1111 1111 1110 0110        
        */

        xx = -11;
        System.out.println( xx >> 1 );        //-6
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1111 0101
            xx>>1 右移一位, 左侧补1
            1111 1111 1111 1111 1111 1111 1111 1010 1        
        */

        xx = -13;
        System.out.println( xx >> 1 );        //-7
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1111 0011
            xx>>1 右移一位, 左侧补1
            1111 1111 1111 1111 1111 1111 1111 1001 1        
        */

        xx = -11;
        System.out.println( xx >>> 1 );        //2147483642
        /* x在内存中的二进制形式为:
            1111 1111 1111 1111 1111 1111 1111 0101
            xx>>>1 无符号移一位
            0111 1111 1111 1111 1111 1111 1111 1010 1        
        */

        //一个整数乘以/除以2的幂次方时,通过移位运算效率最高
    }
}

位运算符:

  按位与 & 按位或 |  按位异或 ^  

/*
位运算符
	按位与&, 按位或|, 按位异或^, 按位取反
	
	&操作符左右两侧如果是布尔值, &就是逻辑与;
	左右两侧为整数,就是按位与
*/
class Demo08 {
	public static void main(String[] args) 	{
		int x = 10;
		int y = 20;
		/*按位与
			x在计算机中存储的01序列为:
				0000 0000 0000 0000 0000 0000 0000 1010
			y的二进制形式为:
				0000 0000 0000 0000 0000 0000 0001 0100
		按位与&
			----------------------------------------------
				0000 0000 0000 0000 0000 0000 0000 0000
		*/
		System.out.println( x&y );			//0

		/*按位或
			x在计算机中存储的01序列为:
				0000 0000 0000 0000 0000 0000 0000 1010
			y的二进制形式为:
				0000 0000 0000 0000 0000 0000 0001 0100
		按位或|
			----------------------------------------------
				0000 0000 0000 0000 0000 0000 0001 1110
		*/
		System.out.println( x|y );			//30

		/*按位异或
			x在计算机中存储的01序列为:
				0000 0000 0000 0000 0000 0000 0000 1010
			y的二进制形式为:
				0000 0000 0000 0000 0000 0000 0001 0100
		按位异或^
			----------------------------------------------
				0000 0000 0000 0000 0000 0000 0001 1110
		*/
		System.out.println( x^y );			//30

		/*按位取反
			x在计算机中存储的01序列为:
				0000 0000 0000 0000 0000 0000 0000 1010			
		按位取反
			----------------------------------------------
				1111 1111 1111 1111 1111 1111 1111 0101
		*/
		System.out.println( ~x );			//-11

		// 如何实现两个数的原地交换,  不借助于第三个变量,实现两个变量的交换
		x = 10;
		y = 20;
		//正常情况下,交换两个变量的值
		int t = x;
		x = y; 
		y = t;

		//方法1:
		x = 10;
		y = 20;
		x = x + y;		//x==30
		y = x - y;		//y==10
		x = x - y;		//x==20

		//方法2:
		x = 10;
		y = 20;
		x = x ^ y;		//x==30
		y = x ^ y;		//y==10
		x = x ^ y;		//x==20

	
	}
}

  

 

      

 

转载于:https://www.cnblogs.com/zhaoletian/p/10613427.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值