位运算

位运算

位运算一般用于直接进行整数加减乘除等基础运算效率更高,但是现在的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];
posted @ 2024-08-17 10:59  LemHou  阅读(22)  评论(0)    收藏  举报