• 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;
        }
    }

    num & (1 << n)可以得到num从右向左第n+1位的bit

    public class UniqueChar {
        public static boolean isUniqueChars(String str) {
            int checker = 0; //bit storage
            for (int i = 0; i < str.length(); ++i) {
                int val = str.charAt(i) - 'a';
                // if bit at index val is 1, then it already exists
                if ((checker & (1 << val)) > 0) {
                    return false;
                }
    
                //Set bit of index val to 1
                checker |= (1 << val);
            }
            return true;
        }
    }

    整数n, n&(n-1) 操作相当于把二进制表示中最右边的1变成0

       // 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 
      public int NumberOf1(int n) { int count = 0; while(n!=0) { n = n&(n-1); count++; } return count; } public int NumberOf1(int n) { int res = 0; while (n!=0) {
         //整数n每次进行无符号右移一位,同1做&运算,可以判断最后以为是否为1 res
    = res + n&1; n>>>=1;   } return res; }

    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。

  • 相关阅读:
    CodeFirst进行数据迁移之添加字段
    .NET程序优化
    DataRead 和DataSet区别
    WCF、WebAPI、WCFREST、WebService之间的区别
    centos6.7下安装配置vnc
    Centos 6.5 优化 一些基础优化和安全设置
    Elasticsearch 检索
    ElasticSearch 5.0.1 java API操作
    Elasticsearch5.0.1 + Kibana5.0.1 + IK 5.0.1安装记录
    Spring的注解@Qualifier小结
  • 原文地址:https://www.cnblogs.com/codingforum/p/7078840.html
Copyright © 2020-2023  润新知