C语言的位运算
程序员文章站
2022-07-15 08:52:41
...
C语言的位运算
位运算
1.按位与(&)
运算规则:两个数的二进制按位运算,同时为1才为1,否则为0
栗子: 1 & 2 00000001 & 00000010 = 00000000
2.按位或(|)
运算规则:两个数的二进制按位运算,其中一个为1则为1,否则为0
栗子: 3 & 5 00000011 | 00000101 = 00000111
3.按位异或(^)
运算规则:两个数的二进制按位运算,位上的数字为异,即不相同,即为1,否则为0
栗子: 3 ^ 5 00000011 ^ 00000101 = 00000110
4.左移(<<)
运算规则:数值转换成二进制向左移动,如果移动n位,相当于乘上了2的n次方
栗子:4 << 2 00000100 << 2 = 00010000
5.右移(>>)
运算规则: 与左移相反
栗子:4>>2 00000100 >> 2 = 00000001
实战
1.判断两个字符串是否相同
int StrEquals(char* a,char* b)
{
//长度不同直接返回false
if (strlen(a) != strlen(b))
{
return 0;
}
//按位运算判断字符串是否相同
//使用equal来判断是否相同是为了防止计时攻击
int equal = 0
for (int i = 0; i < strlen(a)-1; ++i)
{
equal |= a[i] ^ b[i];
}
return equal == 0;
}
2.异或加密
int XOR(char* data, char* dataxor, char* key)
{
int len = strlen(data);
for(int i = 0, i < len; ++i)
{
dataxor[i] = data[i] ^ key;
}
return 0;
}
左移右移注意事项
1.左移到最高位,因为int形变量在最高位储存符号,1为负,所以可能会变成负值,但这可能并不是想要的值。需要注意。
2.int形如果左移33的话会直接进行取模运算,向左移动一位
3.右移会在从最高位开始补0,左移会从最低位开始补0