Java Bit Manipulation

Posted 每天更强一点...

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Bit Manipulation相关的知识,希望对你有一定的参考价值。

OR (|) AND (&) XOR (^) Left Shift (<<) Right Shift (>>) Not (~)
1|0=1 1&0=0 1^0=1 0010<<2=1000 1100>>2=0011 ~1=0

AND 和 &

num & 1 可以得到整数num二进制表达的最后一位。

Example:

// Get maximum binary Gap.
// For example, 9‘s binary form is 1001, the gap is 2.
// An integer x & 1 will get the last digit of the integer.
public class MaxBinaryGap {
    public static int getGap(int N) {
        int max = 0;
        int count = -1;
        int r = 0;

        while (N > 0) {
            // get right most bit & shift right
            r = N & 1;
            N = N >> 1;

            if (0 == r && count >= 0) {
                count++;
            }

            if (1 == r) {
                max = count > max ? count : max;
                count = 0;
            }
        }

        return max;
    }
}

XOR 异或 ^

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

1. a ^ b = b ^ a

2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

Example:

// Given an array of integers, every element appears twice except for one. Find that single one.
public class SingleNumber {
    public static void main(String[] args) {
        int[] A = {1, 2, 3, 3, 2, 1, 5};
        System.out.print(singleNumber(A));
    }

    public static int singleNumber(int[] A) {
        int result = A[0];
        for(int i = 1; i < A.length; i++) {
            System.out.println("result: "+result+"; A[i]: "+ A[i]+"; result^A[i]: "+(result^A[i]));
            result = result ^ A[i];
        }
        return result;
    }
}

<< 移位运算符

java中有三种移位运算符

<<      :     左移运算符,num << n, 相当于num乘以2的n次方

>>      :     有符号右移运算符,num >>n, 相当于num除以2的n次方。如果是正数,则在高位补0,是负数,则在高位补1 (7 >> 1结果是3,)

>>>   :     无符号右移,num >>> n, 将num向右移动n位,无符号右移,忽略符号位,空位都以0补齐

Example:

2<<2, 2 的二进制是00000000 00000000 0000000000000010 (1 int = 4 bytes = 32 bits),它向左移动2 位,就变成了00001000,即8。如果从另一个角度来分析,它向左移动2 位,其实就是乘上2 的2 次方,结果还是8。

System.out.println(Integer.toBinaryString(num)); 可以查看整数的二进制表达。

// Get bit i for a give number n. (i count from 0 and starts from right)
public static boolean getBit(int num, int i){
    int result = num & (1<<i);
 
    if(result == 0){
        return false;
    }else{
        return true;
    }
}

整数的二进制表示

1) 有符号和无符号区别

java中只有 int型 而没有 unsigned integer 和 signed之分.

Java 中一个有符号 int 类型的数是 32 位,他可以表示的范围是 -2^31 ~ 2^31-1 之间。那么如何表示负数?左边以 1 开始就是负的。

这就导致了移位操作符有“有符号”和“无符号”之分。这中区分仅存在于右移的时候。因为需要指明右移以后左边流出的空白以 0 还是 1 补,即移位以后的数是正是负

2) 负数的二进制表达

在计算机中,负数以其正值的补码形式表达。  

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码

比如 00000000 00000000 00000000 00000101 是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

Example

整数-1在计算机中如何表示。

假设这也是一个int类型,那么: 

1、先取1的原码:00000000 00000000 00000000 00000001

2、得反码:     11111111 11111111 11111111 11111110

3、得补码:     11111111 11111111 11111111 11111111

可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。



以上是关于Java Bit Manipulation的主要内容,如果未能解决你的问题,请参考以下文章

Bit Manipulation-476. Number Complement

Bit Manipulation

[leetcode]Bit Manipulation-476. Number Complement

Bit Manipulation

位运算(Bit manipulation)

Leetcode Tags(13)Bit Manipulation