位运算

基本概念

整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算。位运算是指按二进制位进行的运算,C语言不直接支持位运算,必须借助于位运算符完成。运算对象只能为整型或字符型数据

按位与 &

// 按位与 两个数都为1 结果是1
1011 1000 = 0xb8
& 0101 0111 = 0x57
0001 0000 = 0x10;
作用:位(1或0)和 1按位与得本身

按位或 |

两个数中有一个为1则为1
1011 1000 = 0xb8
| 0101 0111 = 0x57
1111 1111 = 0xff
作用:与0或得本身,与1或得1

按位异或 ^

相同位为0 ,不同为1
1011 1000 = 0xb8
0101 0111 = 0x57
^ 1110 1111 = 0xef;
作用:与0异或得本身, 1异或 取反

按位取反 ~

0变1,1变0
1011 1000 = 0xb8
~ 0100 0111 = 0x47

左移 <<

左边丢弃,右边补0


```c
int main()
{
        unsigned char a = 3;//0000 0011
        unsigned char b = a << 1;//0000 0110
        printf("%d\n",b);//6   3*2^1
         b = a << 2;
        printf("%d\n", b);//6   3*2^2
        b = a << 3;
        printf("%d\n", b);//6   3*2^3
        b = a << 6;//1100 0000
        printf("%d\n", b);//6   3*2^6
        b = a << 7;//1000 0000
        printf("%d\n", b);//6   3*2^7
        printf("%d\n", (unsigned char )(a<<7));//6   3*2^7
        system("pause");
        return 0;
}


左移时在最高位的1移出时次高位还为1时,会有倍数关系,注意不要将一个数的所有位都移出,否则编译器可能会报错

右移 >>

由于右移时会向最高位补数,但是最高位对有符号数来说是符号位,0代表正数,1代表负数,所以右移时会区分是算数右移还是逻辑右移,不同的编译器会做不同的右移。算术右移(vs,qt)
算术右移:有符号数,如果为正数,则左边移入0,右边丢弃,如果为负数,左边移入1,右边丢弃
逻辑右移:不关心正数、负数,左边均移入0,右边丢弃

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值