文章目录
一、整型的存储
1. 原码
- 正数(包括+0):符号位为0,数值位由十进制转为二进制存储。
- 负数(包括-0):符号位为1,数值位由十进制转为二进制存储。
- 0有两种表示(+0和-0)
- 字长为n,表示范围为-(2n-1 - 1) ~ 2n-1 - 1
2. 反码
- 正数(包括+0):与原码一致。
- 负数(包括-0):符号位为1,数值位由原码按位取反。
- 0有两种表示(+0和-0)
- 字长为n,表示范围为-(2n-1 - 1) ~ 2n-1 - 1
3. 补码
- 正数(包括+0和-0):与原码一致。
- 负数:符号位为1,数值位由反码加1。
- 0仅有一种表示,即全零存储。
- 计算机中整型存储都用补码。
- 字长为n,表示范围为-2n-1 ~ 2n-1 - 1
二、位运算
运算 | 符号 | 备注 |
---|---|---|
按位与 | & | |
按位或 | | | |
按位异或 | ^ | |
按位取反 | ~ | |
左移 | << | 右边补0 |
有符号右移 | >> | 正数(包括0):左边补0;负数:左边补1 |
无符号右移 | >>> | 左边补0 |
三、位运算应用
1. 整数的奇偶性判断
- 判断奇数:(x & 1) == 1
- 判断偶数:(x & 1) == 0
2. 对2的幂快速乘除
- n<<k,n乘以2^k
- n>>k,n除以2^k
3. swap不借助第三个变量
a ^= b;
b ^= a;
a ^= b;
4. 将最右侧的1改为0
- n = n & (n - 1)
5. 求n的相反数
- n = ~n + 1
6. 切换a和b赋值给x(x初始为a和b其中一个)
- x= a ^ b ^ x
三、代码
剑指 Offer 16. 数值的整数次方
class Solution {
public double myPow(double x, int n) {
if (x == 0) {
return 0;
}
long exp = n;
if (n < 0) {
x = 1 / x;
exp = -exp;
}
double res = 1, base = x;
while (exp != 0) {
if ((exp & 1) == 1) {
res = res * base;
}
base *= base;
exp >>= 1;
}
return res;
}
}
求一个整数是不是素数
public class Main {
public boolean isPrimeNumber(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
bitmap
/**
* ASCLL码为0-127,其中32-126为可显示字符
* 32为空格,48-57为数字,65-90为大写字母,97-122为小写字母
*/
public class Bitmap {
private byte[] bytes;
private int length;
public Bitmap(int length) {
this.length = length;
bytes = new byte[length / 8 + 1];
}
public boolean get(int index) {
if ((bytes[index >> 3] & 1 << (index & 7)) == 0) {
return false;
} else {
return true;
}
}
public void set(int index, boolean value) {
if (value) {
bytes[index >> 3] |= 1 << (index & 7);
} else {
bytes[index >> 3] &= ~(1 << (index & 7));
}
}
}