c/c++位操作简介--移位、位与、位或、异或
来源:互联网 发布:网络语铲屎是什么意思 编辑:程序博客网 时间:2024/05/01 22:42
概述
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下编译
- c/c++位操作简介--移位、位与、位或、异或
- 【c位操作】按位与,按位或
- c-位运算操作符(异或)
- C语语言位与位或位异或在操作寄存器时的特殊作用学习
- c语言中的按位与,与或,异或;
- C语言中的逻辑运算符:按位与,按位或,按位异或,取反,左右移位
- 按位与、或、异或、移位运算
- C语言的按位与、或、非、异或
- C语言的按位与、或、非、异或
- C语言按位与、或、非、异或
- 位运算之 C 与或非异或
- 位运算之C:与、或、非、异或
- 位运算之 C 与或非异或
- C语言的按位与、或、非、异或
- C语言按位 与 或 异或
- 原码反码补码以及移位按位与或异或等位操作的实例
- 位与、或、异或
- Java 位运算(移位、位与、或、异或、非)
- C++ STL 容器 迭代器 算法 [大三四八九月实习]
- forward和redirect的问题(路径问题)
- 仰恩大学CSDN高校俱乐部运营策划
- 机器视觉(相机、镜头、光源)全面概括
- android.content.res.Resources$NotFoundException:String resource ID #0x86
- c/c++位操作简介--移位、位与、位或、异或
- CoreData初识
- 【rzxt】笔者支招:不为人知的TL路由器问题处理
- 组织机构必选备份
- UVA 10602 Editor Nottoobad(贪心)
- 关于移动Web性能的5个神话(转)
- Unity3d 更改鼠标样式
- 几种js实现的动态多文件上传
- 入站第一天,庆祝一下