C/C++ 关于按位操作符

这一篇就简单讲下C++按位操作符使用方法。

一、移位操作符(2字节16位下)

1.左移操作符

句法:Value << Shift (将指定值的所有位向左移动指定位数并将结果返回)

例如:

        int n1 = 568;
        int n2 = n1 << 3;    //值也可以用字面值:int n2 = 568 << 3; 
        std::cout << n2 << std::endl;

上面代码,将值n1(568)所有位向左移动3位 并将结果返回给n2 相当于:568*2^3

实现细节:

IMG Error!

如图表格第一行所示,值568是十进制的,在计算机内部都是以二进制存储的,所以转换成二进制为:1000111000 (前面的0已省去),当处理int n2 = n1 << 3;时,将执行左移操作,左移3位,所以移动后为图中表格第二行所示,结果为:1000111000000 (二进制)也就是十进制的 4544 (568*2^3)然后将结果返回给n2。

注意:所有位左移后,尾部腾出的各位将用0进行填充。

2.右移操作符

句法:Value >> Shift(将指定值的所有位向右移动指定位数并将结果返回)

例如:

        int n1 = 731;
        int n2 = n1 >> 3;     //同上 也可以用int n2 = 731 >> 3:
        std::cout << n2 << std::endl;
上面代码,将值n1(731)所有位向右移动3位 并将结果返回给n2 相当于731/2^3 只是由于移位操作符是针对无符号整形的 返回的也是整形 所以向右移动3位后是91

实现细节:

IMG Error!

如图表格第一行所示,值731转换成二进制就是1011011011,当处理n1 >> 3移位指令时,将该值的二进制所有位向右移动3位,超过边界的将被删除(虚线内的),然后系统将自动为前面腾出来的各位填充0,得到结果为:1011011(前面0可省去)也就是十进制的91,并将结果返回给n2。

另外上面所讲的左移 右移操作符都可以用另一种形式,例如:当n2已定义为整型变量 则n2 >>=3 相当于int n2 = n2 >> 3 和  n2<<=3相当于int n2 = n2 << 3 。

二、逻辑按位操作符

操作符分别有:!  ~(按位取反) &(按位与) |(按位或) ^(按位异或)

先来讲下(!)操作符,句法:!Value

        int n1 = 10;
        int n2 = !n1;      //或int n2 = !10;
        std::cout << n2 << std::endl;
该操作符将指定值若是非零均转换成false,即0。将值为0的转换成true 即1,例如上面代码因为n1的值(10)为非0值,所以转换成0。

再来讲下(~)操作符,句法:~Value

假如有以下代码:

        int v = 463;
        unsigned int Num = ~v;   //或直接 ~463
        std::cout << "Num:" << Num << std::endl;   //Num:4294966832
当执行第二行代码时,系统自动将463所有位取反,并返回结果给Num,实现细节 结果为第二行:

ImgError!

另外如果想得到某个整数类型的变量的可以存储的最大值,可以使用~0,例如:

        unsigned char v1 = ~0;   //结果v1 = 255        相当于:FF
        unsigned int v2 = ~0;    //结果v2 = 4294967295 相当于:FFFFFFFF
然后是&(按位与)操作符,句法:Value1 & Value2

        unsigned int NewNum = 683 & 713;   //NewNum = 649
        std::cout << "NewNum:" << NewNum << std::endl;
当有俩值:683 713 进行按位与运算后得到结果:649 实现细节:

ImgError!

表格第一行是683的系统内部存储格式二进制的形式,第二行是713的二进制形式,当这俩值进行按位与时,系统会对比这俩二进制数列的所有位,如果俩值相同位数的值都为1则结果的对应位就为1,否则为0。

接着|(按位或)操作符,句法: Value1 | Value2

        unsigned int NewNum = 683 | 713;   //NewNum = 747
        std::cout << "NewNum:" << NewNum << std::endl;
还是用上面的俩值(683 713)来进行按位或操作,结果为747,实现细节:

ImgError!

当执行按位或操作时,系统将对俩值的所有对应二进制位进行比较,如果俩值对应的二进制位其中一个为1,则结果对应的二进制位就为1,都为0的话,结果对应位就为0。

最后是^(按位异或)操作符,句法:Value1 ^ Value2。

        unsigned int NewNum = 683 ^ 713;   //NewNum = 98
        std::cout << "NewNum:" << NewNum << std::endl;
假设对683和713进行按位异或操作后,将得到结果98,实现细节:

ImgError!
当执行按位异或操作时,系统将对俩值的所有对应的二进制位进行比较,如果俩值对应的二进制位其中一个值为1(而不是俩个)则结果对应的二进制位就为1,如果俩值对应的二进制位都为1或都为0,结果对应的二进制位则为0。

好了,以上就是我对所有按位操作符的小小的使用方法与总结,如果有问题的地方,还请大家指出来,共同进步~谢谢!

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值