0%

位运算的基本使用

文章字数:456,阅读全文大约需要1分钟

看源码时经常能看到一些位运算的操作,这里列举几种常见的用法。

乘除

  1. 2^n

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    int val = 461637107;
    int res1 = val / 16;
    int res2 = val >> 4;
    System.out.println("res1 = " + res1);// res1 = 28852319
    System.out.println("res2 = " + res2);// res2 = 28852319
    }
  2. 2^n

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    int val = 134563;
    int res1 = val * 16;
    int res2 = val << 4;
    System.out.println("res1 = " + res1);// res1 = 2153008
    System.out.println("res2 = " + res2);// res2 = 2153008
    }

取模

1
2
3
4
5
6
7
public static void main(String[] args) {
int val = 461637107;
int res1 = val % 32;
int res2 = val & 0x1F;// 31的16进制,即5个1。
System.out.println("res1 = " + res1);//res1 = 19
System.out.println("res2 = " + res2);//es2 = 19
}

设置具体bit位的数据为1

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("00000000");
int oldVal = 5;
int n = 3;
int newVal = oldVal | 1 << n;
// 得到的数据
System.out.println(oldVal); // 5
// 输出二进制
System.out.println(df.format(Integer.valueOf(Integer.toString(oldVal, 2))));//00000101
System.out.println(df.format(Integer.valueOf(Integer.toString(newVal, 2))));//00001101
}

设为0同样思路

获取二进制第n个位置上的值

1
2
3
4
5
6
7
public static void main(String[] args) {
int n = 0;
String val = "00001101";
Integer valInt = Integer.valueOf(val, 2);
boolean res = (valInt & 1 << n) != 0;
System.out.println(res ? "1" : "0");//1
}

基本运算符

1.&(按位与运算) 只要有一个为0,就为0,如 0001 & 0100 结果为 0000
2. |(按位或运算) 只要有一个为1,就为1,如 0001 & 0100 结果为 0101
3. ~(取反运算) 这个只对一个数据进行操作,0取反为1,1取反为0;
4. ^ (按位异或运算) 不同为1,相同为0, 如 0001 ^ 0100 结果为 0101