概述

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 unsignedunsigned int au=0xff000005;//这里字面值常量没被认为是符号数,但最好还是0xff000005ustd::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++位操作简介--移位、位与、位或、异或相关推荐

  1. 按位与和异或运算符(Python中两个不常用,却重要的运算符)

    Python中两个不常用,却重要的运算符 按位与 和 异或 运算符 **&按位与运算符:**转化为二进制,每一位分别进行运算,每一位相同为1,不同为0 **^异或运算符:**0和任何数都是变成 ...

  2. python中的且和或怎么表示_python中逻辑与或(and、or)和按位与或异或(、|、^)区别...

    按位与或(&.|.^):按照二进制进行逻辑运算 例如:数字换成二进制,各自位上的0/1进行逻辑运算,得到的结果转换为数字 3 & 2 =0111 & 0010 =0010 =2 ...

  3. 【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础 C 语言知识补充

    文章目录 1 位操作 1.1 按位与 1.2 按位或 1.3 按位异或 1.4 取反 1.5 左移 1.6 右移 2 单片机中常用操作 2.1 不改变其他位时,对某几个位设定值 2.2 移位操作提高代 ...

  4. 位运算总结(按位与,或,异或)

    按位与运算符(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0;  0&1=0;   1&0=0;    1&1= ...

  5. C语言中按位与/或/异或运算笔记

    按位与(&)和,或(丨),异或(^)运算都是属于位运算符 是在二进制形式上进行的一个运算符 很简单的三种运算,但是有时候会很容易记反. 一.按位与运算 按位与运算口诀:同一则一. 1.只有当两 ...

  6. python 的按位与 或 异或 运算

    符号 描述 运算规则                        by MoreWindows & 与 两个位都为1时,结果才为1     (统计奇数) | 或 两个位都为0时,结果才为0  ...

  7. python:逻辑与或(and、or),按位与或异或(、|、^),逻辑短路

    按位与或(&.|.^):按照二进制进行逻辑运算 例如:数字换成二进制,各自位上的0/1进行逻辑运算,得到的结果转换为数字 3 & 2 =0111 & 0010 =0010 =2 ...

  8. 位与,位或,位异或运算符的理解

    1.位与符号是& 真值表达式为: 1&1=1,1&0=0,0&1=0,0&0=0 记忆方式:&& 我们很容易理解..其实就是真真才为真,相当于& ...

  9. 《1.4.ARM裸机第四部分-GPIO和LED》

    转发自 朱有鹏老师 嵌入式linux-核心开发教程 课件 在此对朱老师表示感谢! 第一部分.章节目录 1.4.1.裸机实验体验之usb启动配合dnw工具下载 1.4.2.裸机实验体验之SD卡下载 1. ...

最新文章

  1. 华为p40鸿蒙系统价格有好高,鸿蒙系统版本华为P50新机的曝光,华为P40处境悲惨价格骤降...
  2. 【深度学习】NetAug(网络增强)—Dropout的反面
  3. 不能将参数转化为lparam_反渗透纯水机是将自来水直接转化为超纯水的装置
  4. tensorflow打印模型结构_社区分享 | 详解 TensorFlow 中 Placement 的最后一道防线 — Placer 算法...
  5. CSS3中:nth-child和:nth-of-type的区别深入理解。 关于:nth-child和:nth-of-type的区别之前一直没太注意,经深入理解才发现里面其实暗藏玄机...
  6. Spark数据倾斜解决方案(转)
  7. BugkuCTF-MISC题普通的二维码
  8. qimage加载bmp图片_9个最佳的优化动态gif图片大小的工具
  9. java计算器模拟程序_模拟计算器java程序
  10. hibernate笔记(三)
  11. MATLAB将.mat矩阵写成.tif图片
  12. 京东放大镜效果实现 + 原理分析
  13. M4A格式的ID3信息提取
  14. 【转】C++ std::tr1::shared_ptr使用
  15. Origin: 双Y轴 | 柱状图 | 折线图 | 垂线散点图的结合绘制
  16. python四大数据类型——python筑基系列
  17. 京东架构师讲解京东是如何优化列表页的
  18. 2022年终结——人生中最美好的一站
  19. 【新闻】微信出现大面积BUG!腾讯紧急回应!
  20. 《MFC如何添加子对话框》

热门文章

  1. Dashgo D1使用手册
  2. IT青年们如何突围?要接地气
  3. css filter blur 白边,解决css3毛玻璃效果(blur)有白边问题
  4. leetcode阶段总结——拓扑排序
  5. 非师范专业不能教高中吗 高中教师资格证怎么考
  6. 瓜子二手车后台研发实习生面经
  7. Subresource Integrity 介绍--SRI (Subresource Integrity) 的检查
  8. 走进Vue.js 1.0-姜威-专题视频课程
  9. 懒人的漫画下载工具[基本能用版]
  10. linux 网口对应网卡_Intel 700系列 电口万兆网卡 X710T2L评测