c/c++位操作简介--移位、位与、位或、异或

概述

C/C++里面位操作符表示为如下:左移位 << ,右移位 >>,位与 &,位或 | ,位异或 ^,按位求反~。

位操作符针对的是补码形式(可参见下面的例子,其实我们给出的字面值常量和以16进制输出均是补码形式),这点必须要清楚。

还有就是位操作符的优先级:按位求反 >移位 > 位与 > 位异或 > 位或 优先级,按位求反具有右即合性,其他均具有左结合性,这点在C++里面需要注意,因为输入输出经常用到移位操作符,注意加括号( std::cout<<(a&b) )。

位与 &,位或 | ,位异或 ^的结果中 某位的值只跟两个操作数中相应位的值相关,这三个位操作均各自符合 结合律和交换律。

移位操作

参见:http://www.cnblogs.com/tenghoo/archive/2008/06/01/1211663.html

c语言的移位操作采取补0还是补符号位依赖于具体的机器,在80x86中采用的是:对无符号数采用逻辑移位方式(即左移最低位补0,右移最高位补0)实现,对符号数的向左移位采用和无符号数相同的方法,对符号数的向右移位采用补符号位的方式。下面是代码实例:

#include <iostream>
#include <cstdlib>

int main(int argc,char**argv){
        //for signed 
        int a=0xff000005;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<std::endl;
        for(int i=1;i<=32;++i){
                int  b=a<<i;
                std::cout<<"a<<"<<i<<"="<<b<<"("<<std::hex<<b<<")"<<std::dec<<std::endl;
        }
        std::cout<<"--------"<<std::endl;
        for(int i=1;i<=32;++i){
                int  b=a>>i;
                std::cout<<"a>>"<<i<<"="<<b<<"("<<std::hex<<b<<")"<<std::dec<<std::endl;
        }
        //for unsigned

        unsigned int au=0xff000005;//这里字面值常量没被认为是符号数,但最好还是0xff000005u
        std::cout<<au<<"("<<std::hex<<au<<")"<<std::dec<<std::endl;
        for(int i=1;i<=32;++i){
                unsigned int  b=au<<i;
                std::cout<<"au<<"<<i<<"="<<b<<"("<<std::hex<<b<<")"<<std::dec<<std::endl;
        }
        return EXIT_SUCCESS;
}
部分运行结果截图如下,括号内为补码:

符号数左移


符号数右移


无符号数右移


位求反、位与、位或、异或

需要注意的是符号位也参与运算,代码如下:

#include <iostream>
#include <cstdlib>

int main(int argc,char**argv){
        int a=-1;
        int b=~a;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<" ~ "<<b<<"("<<std::hex<<b<<")"<<std::dec<<std::endl;
        a=-2;
        b=~a;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<" ~ "<<b<<"("<<std::hex<<b<<")"<<std::dec<<std::endl;
        a=1;
        b=~a;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<" ~ "<<b<<"("<<std::hex<<b<<")"<<std::dec<<std::endl;

        a=-1;
        b=1;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<" & "<<b<<"("<<std::hex<<b<<") "<<(a&b)<<std::dec<<std::endl;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<" | "<<b<<"("<<std::hex<<b<<") "<<(a|b)<<std::dec<<std::endl;
        std::cout<<a<<"("<<std::hex<<a<<")"<<std::dec<<" ^ "<<b<<"("<<std::hex<<b<<") "<<(a^b)<<std::dec<<std::endl;
        return EXIT_SUCCESS;
}


以上代码均在gcc下编译



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值