看源码时经常能看到一些位运算的操作,这里列举几种常见的用法。
乘除
- 乘
2^n
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^n
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
}
取模
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
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个位置上的值
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
- |(按位或运算) 只要有一个为1,就为1,如 0001 & 0100 结果为 0101
- ~(取反运算) 这个只对一个数据进行操作,0取反为1,1取反为0;
- ^ (按位异或运算) 不同为1,相同为0, 如 0001 ^ 0100 结果为 0101
网友评论