zoukankan      html  css  js  c++  java
  • 位运算及其妙用

    程序中的所有数在计算机内存中都是以二进制的形式储存的,即只有0和1两种数值,位运算就是直接对整数在内存中的二进制位进行。

    1 <<(向左位移)

    运算规则:a<<b,表示a转为二进制后左移b位,左移后,空位补0。

    例:

    3:      00000000 00000000 00000000 00000011
      	   // 左移2位,空位补2个0
    3<<2: 00000000 00000000 00000000 00001100
    

    所以,3<<2 = 12

    规律:a左移b位,就是a乘以2的b次方。

    2 >>(向右位移)

    运算规则:a>>b,表示a转为二进制后右移b位,右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1。

    例:

    4:	    00000000 00000000 00000000 00000100
    		 // 右移1位。右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1
    4>>1:   00000000 00000000 00000000 00000010
    

    所以,4 >> 1 = 2

    规律:a右移b位,就是a除以2的b次方。

    3 &(与运算)

    运算规则:相同位的两个数字都为1,则为1;若有一个不为1,则为0。

    例:

    5:    00000000 00000000 00000000 00000101
    6:    00000000 00000000 00000000 00000110
    5&6:  00000000 00000000 00000000 00000100    
    

    所以,5&6 = 4

    4 |(或运算)

    运算规则:相同位只要有一个为1即为1。

    例:

    5:    00000000 00000000 00000000 00000101
    6:    00000000 00000000 00000000 00000110
    5|6:  00000000 00000000 00000000 00000111  
    

    所以,5|6 = 7

    5 ^(异或运算)

    运算规则:针对二进制位,如果某位不同则该位为1, 否则该位为0。

    例:

    5:    00000000 00000000 00000000 00000101
    6:    00000000 00000000 00000000 00000110
    5^6:  00000000 00000000 00000000 00000011 
    

    所以,5^6 = 3

    6 ~(取反运算)

    运算规则:对二进制各位数进行取反,即1变成0,0变成1。

    例:

    5:    00000000 00000000 00000000 00000101
    ~5:   11111111 11111111 11111111 11111010 // 补码形式
           11111111 11111111 11111111 11111001 // 反码
           10000000 00000000 00000000 00000110 // 原码
    

    所以,~5 = -6

    位运算的一些妙用

    • 在不使用第三个变量的情况下,如何交换两个变量的值?

    常规操作:

        void swap(int a, int b) {
            int temp = a;
            a = b;
            b = temp;
        }
    

    骚操作:

        void swap(int a, int b) {
            a^=b;
            b^=a;
            a^=b;
        }
    
    • 判断奇偶

    常规操作:

        if (a%2 == 0) {
            System.out.println("偶数");
        } else {
            System.out.println("奇数");
        }
    

    骚操作:

        if ((a&1) == 0) {
            System.out.println("偶数");
        } else {
            System.out.println("奇数");
        }
    
    • 求平均数

    常规操作:

        int average(int x, int y) {    
            return (x+y)/2; 
        } 
    

    骚操作:

        int average(int x, int y) {    
            return (x&y)+((x^y)>>1); 
        } 
    

  • 相关阅读:
    Java知多少(57)主线程
    Java知多少(56)线程模型
    Java知多少(55)线程
    Java知多少(54)断言详解
    Java知多少(53)使用Java创建自己的异常子类
    Java知多少(52)内置异常
    Java知多少(51)finally
    Java知多少(50)Java throws子句
    Java知多少(49)throw:异常的抛出
    Java知多少(48)try语句的嵌套
  • 原文地址:https://www.cnblogs.com/sum-41/p/11121620.html
Copyright © 2011-2022 走看看