1. 判断奇数偶数
int n = 10;
// 1 判断奇数偶数
if ((n & 1) == 1) {
// 奇数
}
else if ((n & 1) == 0) {
// 偶数
}
2. 乘以2左移,除以2右移
// 2 乘以2左移,除以2右移,无符号整数这么用,但要注意溢出,有符号整数注意符号
int n2 = n << 1;
int n3 = n >> 1;
3. 交换2个数,不使用其他的数
// 3 交换2个数,不使用其他的数
int a = 10;
int b = 12;
/// 方法1
a = a + b;
b = a - b;
a = a - b;
/// 方法2
a = a ^ b;
b = a ^ b; // 相当于 a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a;
a = a ^ b; // 相当于 a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b;
4. a的b次方
// 4 a的b次方 a = 10, b = 12
/10进制 a^b = a ^ 12
/ 2进制 a^b =a^(1100) = a ^ (1000 + 100)
/ 2进制 a^b = a ^ 1000 + a ^ 100
/10进制 a^b = a ^ 8 + a ^ 4
int sum = 0;
while (b != 0) {
if (b & 1 == 1) {
sum *= a;
}
a *= a;
b = b >> 1;
}
5. 不用加减乘除做加法,利用二进制位运算
// 5 不用加减乘除做加法,利用二进制位运算
// a + b
int Add(int left, int right)
{
int sum = 0;
int carry = 0;
do
{
// 不考虑进位,对应位相加
// 0+0、1+1均为0,0+1、1+0均为1,即为异或运算
sum = left ^ right;
// 计算进位
// 1+1才会进位,0+0、0+1、1+0均不进位,即为与运算,
// 向前进位需要左移1位
carry = (left & right) << 1;
left = sum;
right = carry;
} while (right != 0);
return left;
}