Java位运算符及其用法 - Go语言中文社区

Java位运算符及其用法


位运算符:

位运算符

运算符

运算

范例

<<

左移

3 << 2 = 12 --> 3*2*2=12

>>

右移

3 >> 1 = 1   --> 3/2=1

>>>

无符号右移

3 >>> 1 = 1 --> 3/2=1

&

(按位)与运算

6 & 3 = 2

|

(按位)或运算

6 | 3 = 7

^

(按位)异或运算

6 ^ 3 = 5

~

(按位)反码

~6 = -7

  •     &: 按位与

        同为1时,结果才是1;

  •     |:按位或

        同为0时,结果才是0;

  •     ^:按位异或

        不同为1,相同为0;
        特点:
            a ^ b = b ^ a;
            a ^ 0 = a;
            a ^ a = 0;

  •     ~:按位取反

        ~1为0, ~0为1

注意事项:
    位运算符只能连接整数和字符型。(我们可以把字符类型看成无符号的整型)

  • <<: 左移

    低位补0,被移除的高位丢弃

  • >>: 右移

    被移位的二进制最高位是0,右移后,空缺位补0;
    最高位是1,最高位补1。

  • >>>: 无符号右移

    被移位二进制最高位无论是0或者是1,空缺位都用0补。
    
    结论:
        左移n各单位,相当于乘以2^n;
        右移n各单位,相当于除以2^n;
        如果移除的单位m, 超过了整数的字长a, 那么实际移位是 m 对 a 取余个单位。

class OperatorDemo7 {
	public static void main(String[] args) {
		/*int a = 64;
		System.out.println(a << 2);		// 256
		System.out.println(a >> 2);		//16
		System.out.println(-a >> 2);	// -16
		System.out.println(a >>> 2);	// 16
		System.out.println(-a >>> 2);	// */
		
		System.out.println("---------------------------");
		int m = 0xcafebabe;
		System.out.println(m >>> 31); // 1
		System.out.println(m >>> 32); // 0
		System.out.println(m);
		System.out.println(64 >>> -31); // 32     -31 mod 32 = 1 (数学中的取余运算)
		
	}
}

位运算符的用法

  • 掩码(&)

flag &= MASK;

想要flag中哪些位“掩蔽”,就把MASK对应位置0;想要flag中哪些位“显出”,就把MASK对应位置1

  • 打开位(设置位)(|)

flag |= MASK;
  • 关闭位(清空位)(& ~)

flag &= ~MASk;
  • 切换位(^)

flag ^= MASK;
  • 检查位的值(&)

if((flag & MASK) == MASK)

 

  •     判断一个数是否是奇数(&)

    位运算是直接对二进制进行操作的,所以效率很高。
   
    奇数的特点:
        最后一个是1;
        a & 1 == 1

class OperatorDemo2 {
    public static void main(String[] args) {
        int a = 2019;
        // System.out.println(a % 2 == 1);
        // System.out.println(a % 2 != 0);
        System.out.println((a & 1) == 1);
    }
}
  •     对2的n次幂取余, 可以转换成位运算(&)

    a % 64
    a & (64 - 1);
    
    0100 1100 0101 1010 0100 1111 1011 0001
%    0000 0000 0000 0000 0000 0000 0100 0000
    0000 0000 0000 0000 0000 0000 0011 0001
    
    0100 1100 0101 1010 0100 1111 1011 0001
&    0000 0000 0000 0000 0000 0000 0011 1111
    0000 0000 0000 0000 0000 0000 0011 0001

class OperatorDemo3 {
	public static void main(String[] args) {
		int a = 2019;
		System.out.println(a % 64);
		System.out.println(a & (64 - 1));
	}
}
  • 判断一个数是否是2^n(&)

        a & (a - 1) == 0;
    特点:只有1位是1;
    
    0001 0000
&    0000 1111
    0000 0000
    
    0011 0000
&    0010 1111
    0010 0000

class OperatorDemo4 {
	public static void main(String[] args) {
		int a = 2019;
		System.out.println((a & (a - 1)) == 0);
	}
}

实现两个整数变量的交换(^)

class OperatorDemo5 {
	public static void main(String[] args) {
		int a = 3;
		int b = 4;
		//方式一
		/*int temp;
		temp = a;
		a = b;
		b = temp;
		System.out.println("a=" + a);
		System.out.println("b=" + b);*/
		
		// 方式二
		// +和-互为逆运算;
		/*a = a + b;  // a = 3 + 4; b = 4;
		b = a - b;  // b = 3 + 4 - 4 = 3; a = 3 + 4
		a = a - b;  // a = a - b = 3 + 4 - 3 = 4; b = 3;
		System.out.println("a=" + a);
		System.out.println("b=" + b);*/
		
		// 方式三
		/*a = a ^ b;	// a = 3 ^ 4; b = 4;
		b = b ^ a;  // b = 3 ^ 4 ^ 4 = 3 ^ 0 = 3, a = 3 ^ 4;
		a = a ^ b;  // a = 3 ^ 4 ^ 3 = 4 ^ 0 = 4, b = 3;
		System.out.println("a=" + a);
		System.out.println("b=" + b);*/
		
		// 用一句话搞定;
		/*a ^= b ^= a ^= b;
		System.out.println("a=" + a); // a = 0
		System.out.println("b=" + b); // b = 3*/
		// 不要在代码中这样写!!!
		// 代码最好简单易懂!,不要难为别人。
		// a = (a + b) - (b = a);
		a = (a ^ b) ^ (b = a);
		System.out.println("a=" + a); 
		System.out.println("b=" + b);
		
	}
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tangxuan2014/article/details/90046683
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 12:38:51
  • 阅读 ( 1034 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢