C语言的位运算

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值