【总结】浅刷leetcode,对于位运算提高性能的一些总结

位运算技巧是计算机科学中非常重要的一部分,它可以用来解决很多实际问题。在本篇博客中,我们将介绍一些常见的位运算技巧,以及它们在实际应用中的使用。

什么是位运算?

位运算是一种对二进制数进行操作的运算。它包括按位与、按位或、按位异或、按位取反等操作。在计算机中,位运算是非常快速的,因为它们可以直接在硬件层面上执行。

位运算技巧

1. 判断奇偶性

我们可以使用位运算来判断一个数的奇偶性。如果一个数的二进制表示的最后一位是0,那么它就是偶数,否则它就是奇数。因此,我们可以使用按位与运算符(&)来判断一个数的奇偶性。

public static bool IsEven(int n)

{

return n % 2 == 1;

}

public static bool IsEven(int n)

{

return (n & 1) == 0;

}

相比于n%2通过取模运算来判断一个数字是否是奇偶数,&运算性能快非常多。取模运算的实现原理是,将被除数按位分解得到的每一位与除数相比较,如果大于除数,则将除数不断左移一位(乘2),直到它大于被除数为止,然后将被除数减去这个数,再进行下一次比较。如果小于除数,则将对应的商位为0,然后考虑下一位。

2. 交换两个数

我们可以使用位运算来交换两个数的值。假设我们有两个变量a和b,我们可以使用异或运算符(^)来交换它们的值。

交换两个数有很多种实现方法

比如通过临时变量,通过加减法

static bool Swap(ref int a,ref int b)

{

//通过临时变量

int temp = a;

a = b;

b = temp;

//通过加法或者减法省去临时变量

a += b;

b -= a;

a -= b;

}

利用异或的性质交换两个数,是性能最好的一种手段。

static bool Swap(ref int a, ref int b)

{

//通过异或交换两个数的值

a ^= b;

b ^= a;

a ^= b;

}

异或基本性质如下:

1. 可逆性:A xor B等于C,那么C xor B等于A,C xor A等于B。也就是说,对于任意两个值进行异或运算所得的结果,只要其中有一个值和结果以及另外一个值已知,就可以得到另外一个值。

2. 结合律和交换律:异或运算可以任意交换和结合,例如(A xor B) xor C = A xor (B xor C),A xor B = B xor A。

3. 自反性:一个数和自己异或的结果为0,即A xor A = 0。

4. 零值:任何数和0进行异或的结果都等于这个数本身,即A xor 0 = A。

异或运算在计算机中有广泛应用,例如数据加密、压缩、校验等领域。其中,数据校验往往采用奇偶校验或者循环冗余校验(CRC)算法,而这些算法都需要用到异或运算。此外,在编程语言中,异或运算也经常用于实现位操作和状态判断等功能。

3. 判断一个数是否是2的幂次方

如果一个数是2的幂次方,那么它的二进制表示中只有一位是1,其余位都是0。因此,我们可以使用按位与运算符(&)来判断一个数是否是2的幂次方。n & (n - 1)的运算结果可以将n的二进制表示中的最后一个1变成0,其他位保持不变,也就是把n的最低位的1变成0。另外,n & (n - 1)的运算还可以用于统计一个二进制数中1bits的个数。如果一个数的二进制表示中有k个1bit,那么对这个数连续做k次n & (n - 1)操作,就可以将二进制表示中的所有1bit都消除。

static bool IsPowerOfTwo(int n)

{

return (n & (n - 1)) == 0;

}

4. 取绝对值

我们可以使用位运算来取一个数的绝对值。假设我们有一个变量n,我们可以使用按位与运算符(&)和减法运算符(-)来取它的绝对值。

public static int Abs(int n)

{

int mask = n >> 31; return (n + mask) ^ mask;

}

5. 计算平均数

我们可以使用位运算来计算两个数的平均数。假设我们有两个变量a和b,我们可以使用位运算符(>>)来计算它们的平均数。

public static int Average(int a, int b)

{

return (a & b) + ((a ^ b) >> 1);

}

结论

位运算技巧在计算机科学中是非常重要的。它们可以用来解决很多实际问题,例如判断奇偶性、交换两个数、判断一个数是否是2的幂次方、取绝对值和计算平均数等。在实际应用中,我们应该根据具体情况选择合适的位运算技巧来解决问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 手撕位运算 0x00 -- 位运算概览 符号描述运算规则&按位与,2个位都为1,结果为1|按位或,一个位为1,结果...
    Hello_kid阅读 4,655评论 0 0
  • 基础知识 对于位运算,大家都很熟悉,基本的位操作有与(&)、或(|)、非(~)、异或(^)等等。在面试中经常会出现...
    瑜小贤阅读 2,939评论 0 0
  • 位运算有 & 按位与 | 按位或 ^按位异或 >>n 右移n位 <<n 左移n位 参考:https://zhuan...
    abboo阅读 5,907评论 0 1
  • 数据的表示和运算 一、数值和编码 1.基本概念 ①进位制:表示数时,仅用一位数码往往不够用,必须用进位计数的方法组...
    我可能是个假开发阅读 10,365评论 1 1
  • to-do:看一下别人写的题解 https://github.com/981377660LMT/algorithm...
    winter_sweetie阅读 4,233评论 1 0

友情链接更多精彩内容