由于卷了一天的KMP算法,并没有什么收获,所以发点别的东西
位运算
一. 什么是位运算
位运算是计算机中一种对二进制位进行操作的技术。在计算机中,数据存储和处理的最基本单位是比特(bit),而位运算就是对这些比特进行操作的一组运算。位运算常用于提高程序执行效率、节省存储空间以及处理某些特定的问题。
在C语言中,位运算常常用于进行底层的位操作,这些操作可以用于优化代码、节省内存、实现特定算法等。
-
位运算的基本操作
位运算包括一些基本的操作,主要有以下几种:
- 与运算(&):对应位都为1时,结果为1,否则为0。
- 或运算(|):对应位只要有一个为1时,结果为1。
- 异或运算(^):对应位相同时结果为0,不同时结果为1。
- 取反运算(~):对应位取反,0变为1,1变为0。
- 左移运算(<<):将二进制数向左移动指定位数,相当于乘以2的指定次方。
- 右移运算(>>):将二进制数向右移动指定位数,相当于除以2的指定次方。
2.位运算运用的具体案例(力扣.面试题 05.06. 整数转换)
整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。
示例1:
输入:A = 29 (或者0b11101), B = 15(或者0b01111) 输出:2
示例2:
输入:A = 1,B = 2 输出:2
思路:也就是通过异或运算(^) 找到两对应位是否相同.再统计'1'共有多少即可 注意要用unsigned 来处理符号("+ -") 负数按补码形式参加按位或运算。
int convertInteger(int A, int B){
unsigned int n = A ^ B;
int count = 0;
while(n){
if((n & 1) != 0){
count++;
}
n >>= 1;//右移动一位
}
return count;
}
3.位运算的注意事项
在使用位运算时,需要注意一些细节:
-
符号位: 在进行位运算时,对于有符号整数,要注意符号位的影响,可能导致意外的结果。
-
溢出: 左移运算可能导致溢出,因此在使用时要确保不会超出数据类型的范围。
-
适用范围: 位运算通常用于处理底层的数据表示和操作,不是所有问题都适合使用位运算。