位运算
位运算
位运算一般用于直接进行整数加减乘除等基础运算效率更高,但是现在的C++编译器直接进行加减运算,并没有明显加快,但是理解实现逻辑是必要的。如果需要对很大的数进行运算,建议使用字符串进行运算。
两数相加
原码相加即可。
void BitAdd(int a, int b)
{
// a + b
while (b != 0){
int carry = a & b;
a ^= b; // 0110
b = carry << 1;
}
}
两数相减
使用补码实现两数相减。
void BitSub(int a, int b)
{
// a - b
b = ~b + 1; // 负数用补码表示
while (b != 0){
int carry = a & b;
a ^= b; // 0110
b = carry << 1;
}
}
两数相乘
解法:乘数的每一位与被乘数相乘,长乘法,但是由于二进制乘法,所以只乘1即可,也就是还为原值。
void BitMulti(int a, int b)
{
// a * b
int negativeCount = 0;
if (a < 0){
a = abs(a);
negativeCount++;
}
if (b < 0){
b = abs(b);
negativeCount++;
}
int res = 0;
// 二进制乘法其实类似于长乘法,但是由于是二进制,所以,可以直接通过与运算得到每一位和被乘数的成绩然后相加即可。
while (b != 0){
int tmp = b & 1; // 从b取一位
if (tmp != 0){
res += a;
}
a <<= 1;
b >>= 1;
}
}
两数相除
不太好理解,还未理解。
十进制数转十六进制字符串
int c = -1;
int d = c & 0x7fffffff;
cout << d; // d还是-1
int c = -1;
int e = c & 0xff;
cout << e; // e:
// 十进制数val[0-16)转十六进制字符串,直接利用Ascii码转
char c = val < 10? char('0' + val) : char('a' + val - 10);
// 使用string table去转
string table = "0123456789abcdef";
char c = table[val];

浙公网安备 33010602011771号