1. 进制
二进制:0, 1
八进制:0~8
十进制:0~9
十六进制:0~9、A~F
1.1 进制转换
十进制转二进制:除 2 取余数,逆序排列
@Test
public void convert() {
int data = 240;
System.out.println("二进制:" + Integer.toBinaryString(data));
System.out.println("八进制:" + Integer.toOctalString(data));
System.out.println("十六进制:" + Integer.toHexString(data));
System.out.println(Integer.valueOf("11110000", 2));
System.out.println(Integer.valueOf("F0", 16));
System.out.println(0xF0);
}
2. 位运算符
位运算符主要用来对操作数二进制的位进行运算
按位运算表示按每个二进制位(bit)进行计算
运算符 | 描述 | 运算规则 |
---|---|---|
& | 按位与(AND) | 0&0=0 0&1=0 1&0=0 1&1=1 |
| | 按位或(OR) | 0|0=0 0|1=1 1|0=1 1|1=1 |
^ | 按位异或(XOR) | 0^0=0 0^1=1 1^0=1 1^1=0 |
~ | 按位取反(NOT) | ~1=0 ~0=1 |
2.1 位运算符 vs 布尔运算符
- & 与 && 运算结果一样,但 && 会短路
- 布尔运算符通常用于布尔值,而按位运算符通常用于整数值
- 布尔运算符是短路,但按位运算符不是短路
3. 位移运算符
- 按二进制形式把所有的数字向左(右)移动对应的位数
- byte 和 short 会先转换为 int 再进行移位
运算符 | 描述 | 运算规则 |
---|---|---|
<< | 左移 | 左移对应的位数,高位移出(舍弃),低位的空位补零 |
>> | 有符号右移 | 右移对应的位数,低位移出(舍弃),高位的空位补零 |
>>> | 无符号右移 |
4. 复合位赋值运算符
运算符 | 描述 | 实例 | 简称 |
---|---|---|---|
&= | 按位与赋值 | a &= b => a = a & b |
与等于 |
|= | 按位或赋值 | a |= b => a = a | b |
或等于 |
^= | 按位异或赋值 | a ^= b => a = a ^ b |
|
~= | 按位取反赋值 | a ~= b => a = a ~ b |
|
«= | 按位左移赋值 | a «= b => a= a « b |
|
»= | 按位右移赋值 | a »= b => a = a » b |
5. 位掩码(BitMask)
位掩码(BitMask),是”位(Bit)“和”掩码(Mask)“的组合词。”位“指代着二进制数据当中的二进制位,而”掩码“指的是一串用于与目标数据进行按位操作的二进制数字。组合起来,就是”用一串二进制数字(掩码)去操作另一串二进制数字“的意思
public class Mask {
/**
* 掩码(MASK)
* 标识符,每个bit表示一种状态
*/
private static int base = 1;
// 0001
private static int devMask = base;
// 0010
private static int testMask = base << 1;
// 0100
private static int prodMask = base << 2;
@Test
public void test() {
// 0101
int value = 5;
// 0101 & 0001 = 0001
boolean develop = isDevelop(value);
// 0101 & 0010 = 0000
boolean test = isTest(value);
// 0101 & 0100 = 0100
boolean prod = isProd(value);
}
public boolean isDevelop(int value) {
return (value & devMask) != 0;
}
public boolean isTest(int value) {
return (value & testMask) != 0;
}
public boolean isProd(int value) {
return (value & prodMask) != 0;
}
}
网友评论