欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: 笔记