📜  最大化表达|位操作(1)

📅  最后修改于: 2023-12-03 14:55:19.093000             🧑  作者: Mango

最大化表达|位操作

在计算机科学中,运用位操作可以达到快速、高效的运算目的。而最大化表达则是在位操作的基础上,对于字节、整型、长整型等不同的数据类型,尽可能地利用位运算实现功能,以达到代码简洁和性能高效的目的。

位运算和位操作

位运算是指对于二进制数按位进行的逻辑运算,包括位与(&)、位或(|)、位异或(^)、位取反(~)等。在程序开发中,位运算可以大幅度提高程序的效率。

位操作是指把某个操作分解成若干子操作,并利用位运算进行快速执行的操作方法。例如,在求x/2的时候,可以使用右移运算符(>>)进行,效率极高。

下面是C++中的位运算符:

|符号|说明| |:---:|:---:| |&|按位与| |||按位或| |^|按位异或| |~|按位取反| |<<|左移| |>>|右移|

位运算实例
判断奇偶

假设有一个整数a,如何快速判断它是奇数还是偶数呢?

if (a & 1 == 0)
{
    cout << "a是偶数" << endl;
}
else
{
    cout << "a是奇数" << endl;
}

这是因为二进制数的最后一位为0,表示它是偶数;而当它为1时,表示它是奇数。

交换变量

实现两个变量的交换,通常需要使用第三方变量,但是借助位运算,可以更加方便地实现。

a ^= b;
b ^= a;
a ^= b;
取绝对值

对于一个整数x,输出它的绝对值。由于负数取反再加1等于绝对值的值,因此可以借助位运算实现。

int getAbs(int x)
{
    int y = x >> 31;//获取符号位
    return (x ^ y) - y;//取反加1即为绝对值
}
最大化表达

最大化表达,就是让程序中的表达式达到最简和最有效的状态,将每一个表达式都用位运算替代,省略多余的乘法、除法、取模等操作。

例如,在计算mid = (left + right) / 2时,可以使用右移运算符,将除法转化为右移1位。同时,将左移运算符用在乘法上,可以加速计算。最终的代码实现如下:

mid = (left + right) >> 1;          //mid = (left + right) / 2;
mid = (left + (right - left) >> 1); //mid = (left + right) / 2;
mid = ((left + right) >> 1) + ((left + right) & 1);//mid=(left+right)/2,向上取整

因此,在编程时,要充分利用位运算的优势,最大化表达,让程序运行更快更有效。