Skip to main content

JAVA位操作小技巧

基本的位操作包括:取反(~),与(&),或(|),异或(^),左移(<<),右移(>>)。注意:所有操作都是对内存中的二进制数据进行操作,因此处理数据的速度非常快。

基础操作

取反操作(~

说明:所有位都取反(包括符号位),0->1,1->0

int num = 4; //0000 0100
System.out.println(~num); //-5, 1111 1011

与操作(&

说明:对应二进制位都取与操作,只有两个均为1时才取1,否则为0

int numA = 3; // 0000 0011
int numB = 9; // 0000 1001
System.out.println(numA & numB); //1, 0000 0001

或操作(|

说明:对应二进制位都取或操作,只要有一个为1则取1,否则为0

int numA = 3; // 0000 0011
int numB = 9; // 0000 1001
System.out.println(numA | numB); //11, 0000 1011

异或操作(^

说明:对应二进制位相同时取0,不相同时取1

int numA = 3; // 0000 0011
int numB = 9; // 0000 1001
System.out.println(numA ^ numB); //10, 0000 1010

左移操作(<<

说明:二进制位向左移动,右边填充0(注意:符号位不变)

int numA = -3; // 1111 1101
System.out.println(numA << 2); //-12, 0000 1010

右移操作(>>

说明:二进制位向右移动,最高位由符号位填充

int numA = -3; // 1111 1101
System.out.println(numA >> 2); //-12, 0000 1010

小技巧

判断奇偶

  • 只要根据末位是0还是1来决定:
if ( i & 1 == 0 ){
    System.out.println("even number");
} else  ( i & 1 == 1 ) {
    System.out.println("odd number");
}


衍生:获取某个数的第i位(判断某个数的第i位是0还是1

private static int getBit(int num, int i){
    return (num & 1 << i);
}

计算某个正数二进制表示法中1的个数

num &= (num-1) 可以删除二进制中最右边的1

//calculate the number of 1 in the positive number
private static int countBit(int num){
    int count = 0;
    for(; num > 0; count++){
        num &= (num-1);
    }
    return count;
}

将第i位设置为 10

  • 设置为1
private static int setBitOne(int num, int i){
    return ( num | (1 << i) );
}

  • 设置为0
private static int setBitZero(int num, int i){
    int mask = ~ ( 1 << i );
    return ( num & mask );
}

打赏
微信扫一扫支付
微信logo微信扫一扫, 打赏作者吧~

mickey

记录生活,写给几十年后的自己。