zoukankan      html  css  js  c++  java
  • 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
    
    	
    	}
    }
    

      

          

  • 相关阅读:
    JS高级——eval
    JS高级——Object.prototype成员
    JS高级——原型链
    JS高级——逻辑中断
    移动web——bootstrap媒体对象
    移动web——bootstrap如何修改原组件
    移动web——bootstrap响应式轮播图
    Leetcode题解
    位运算实现四则运算(C++实现)
    扫码登陆原理
  • 原文地址:https://www.cnblogs.com/zhaoletian/p/10613427.html
Copyright © 2011-2022 走看看