C语言位运算符:与、或、异或、取反、左移和右移

2023-05-16


语言位运算符:与、或、异或、取反、左移和右移

位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

C语言提供的位运算符列表
运算符 含义 描述
& 按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移用来将一个数的各二进制位全部左移N位,右补0
>> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0


1按位与运算符(&
 按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2)补足成一个字节,则是00000011(2)。5的二进制编码是101(2),将其补足成一个字节,则是00000101(2)
按位与运算:
00000011(2)
&00000101(2)
00000001(2)
由此可知3&5=1
c语言代码:
#include <stdio.h>
main()
{
int a=3;
int b = 5;
printf("%d",a&b);
}
按位与的用途:
(1)清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:

原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
例:原数为43,即00101011(2),另找一个数,设它为148,即10010100(2),将两者按位与运算:
00101011(2)
&10010100(2)
00000000(2)
c语言源代码:
#include <stdio.h>
main()
{
int a=43;
int b = 148;
printf("%d",a&b);
}
(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100
(3)保留指定位:
与一个数进行“按位与”运算,此数在该位取1.
例如:有一数84,即01010100(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:
01010100(2)
&00111011(2)
00010000(2)
即:a=84,b=59
 c=a&b=16
c语言源代码:
#include <stdio.h>
main()
{
int a=84;
int b = 59;
printf("%d",a&b);
}


2按位或运算符(|
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真


例如:60(8)|17(8),将八进制60与八进制17进行按位或运算。
00110000
|00001111
00111111
c语言源代码:
#include <stdio.h>
main()
{
int a=060;
int b = 017;
printf("%d",a|b);
}
应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要将a与17(8)进行按位或运算即可。


3、交换两个值,不用临时变量
例如:a=3,即11(2);b=4,即100(2)。
想将a和b的值互换,可以用以下赋值语句实现:
 a=a∧b;
 b=b∧a;
 a=a∧b;
a=011(2)
 (∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)
 (∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)
 (∧)a=111(2)


a=100(2)(a∧b的结果,a已变成4)
等效于以下两步:
 ①执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
 ②再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),

因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
很神奇吧!
c语言源代码:
#include <stdio.h>
main()
{
int a=3;
int b = 4;
a=a^b;
b=b^a;
a=a^b;
printf("a=%d b=%d",a,b);
}


4取反运算符(~
他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。
例如:~77(8)
源代码:
#include <stdio.h>
main()
{
int a=077;
printf("%d",~a);
}


5、左移运算符(<<

左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负

值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即00001111(2),左移2

位得00111100(2)。
源代码:
#include <stdio.h>
main()
{
int a=15;
printf("%d",a<<2);
}
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该

数左移时被溢出舍弃的高位中不包含1的情况。
 假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0

,而左移2位时,溢出的高位中包含1。


6、右移运算符(>>
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负

值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分

用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注

意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移

入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的

系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
例: a的值是八进制数113755:
 a:1001011111101101 (用二进制形式表示)
 a>>1: 0100101111110110 (逻辑右移时)
 a>>1: 1100101111110110 (算术右移时)
 在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo C和其他一些C

编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。
源代码:
#include <stdio.h>
main()
{
int a=0113755;
printf("%d",a>>1);
}


7、位运算赋值运算符

位运算符与赋值运算符可以组成复合赋值运算符。
 例如: &=, |=, >>=,<<=, ∧=
 例: a & = b相当于 a = a & b
 a << =2相当于a = a << 2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言位运算符:与、或、异或、取反、左移和右移 的相关文章

  • __thread关键字

    thread是GCC内置的线程局部存储设施 xff0c 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 xff0c 各个线程的值互不干扰 可以用来修饰那些带有全局性且值可能变 xff0c 但是又不值得用全局变量保护的变
  • SCRUM框架包括3个角色、3个工件、5个活动、5个价值

    转自http www scrumcn com agile scrum knowledge library scrum html SCRUM 是一个用于开发和维持复杂产品的框架 Scrum 是一个用于开发和维持复杂产品的框架 xff0c 是一
  • Hadoop伪分布式安装步骤

    Hadoop伪分布式安装步骤 目录 Hadoop伪分布式安装步骤 一 永久关闭防火墙 二 配置主机名 1 编辑network文件 xff1a vim etc sysconfig network 2 将HOSTNAME属性改为指定的主机名 x
  • MPU6050的一些问题及解决办法

    最近做的项目要用到MPU6050 xff0c 出现了以下这些问题 xff1a 当然 xff0c 也有一些奇怪的事 xff0c 我是在淘宝上买的现成的模块 xff0c 那个ADO无论接地还是高电平 xff0c MPU的地址都是用0xD0 xf
  • 程序员的期望与现实

    来自 xff1a 程序员最幽默 xff08 ID xff1a humor1024 xff09 0 我期望的代码 VS 实际代码的工作方式 1 我认为我的代码 VS 项目经理看到的代码 2 我心里想做的架构 VS 我真正写出来的架构 3 开发
  • PixHawk Bootloader

    在https github com PX4这里下载的Bootloader代码 xff0c 编译TARGET HW PX4 FMU V2这个版本的 xff0c 然后将代码烧录到STM32F4探索者这块开发板上 xff0c 代码能够正常运行 x
  • 解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本不匹配的问题

    解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本 xff08 同时内核存在问题 xff09 不匹配的问题 不要轻易升级显卡驱动版本 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xf
  • NVIDIA Jetson Xavier NX入门(1)——镜像烧写

    NVIDIA Jetson Xavier NX入门 xff08 1 xff09 镜像烧录 1 准备SD卡并且格式化 推荐使用SD Card Formater软件进行SD卡格式化 xff0c SD Card Formater软件下载地址 界面
  • NVIDIA Jetson Xavier NX入门(2)——系统设置;环境搭建

    NVIDIA Jetson Xavier NX入门 xff08 2 xff09 系统设置 环境搭建 1 NVIDIA Jetson Xavier NX连接显示器 键盘 鼠标 xff1b 2 Jetson Xavier NX连接电源后 xff
  • NVIDIA Jetson Xavier NX使用UART进行串口通信

    NVIDIA Jetson Xavier NX使用UART进行串口通信 一 NVIDIA Jetson Xavier NX的40pin接口 NVIDIA Jetson Xavier NX开发板俯视图 xff1a 2 开发板上打印出的UART
  • 远程服务器时Ubuntu报错:qt.qpa.xcb: could not connect to display

    远程服务器时Ubuntu报错 xff1a qt qpa xcb could not connect to display 远程服务器时Ubuntu报错 xff1a qt span class token punctuation span q
  • linux下USB设备编号固定

    linux下USB设备插入时系统自动分配编号 xff0c 多个相同设备时 xff0c 按插入顺序分配编号 以串口为例 xff0c 插入的USBtoSerial顺序不一样时 xff0c 系统分配的设备号是不一样的 但是每个USB接口对设备来说
  • Java进阶书籍推荐

    学习Java xff0c 书籍是必不可少的学习工具之一 xff0c 尤其是对于自学者而言 废话不多说 xff0c 下边就给大家推荐一些Java进阶的好书 第一部分 xff1a Java语言篇 1 Java编程规范 适合对象 xff1a 初级
  • GitHub+Docker Hub自动构建镜像

    一 什么是Dockerfile xff1f Dockerfile是一个包含用于构建镜像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成镜像 它们简化了从头到尾的流程并极大的简化了部署
  • 前端工程化 - 剖析npm的包管理机制(完整版)

    导读 现如今 xff0c 前端开发的同学已经离不开 npm 这个包管理工具 xff0c 其优秀的包版本管理机制承载了整个繁荣发展的NodeJS社区 xff0c 理解其内部机制非常有利于加深我们对模块开发的理解 各项前端工程化的配置以加快我们
  • GPRS模块开发初步(软件)

    文章来源 xff1a http blogold chinaunix net u1 56388 showart 1121149 html 1 AT 指令简介 AT 指令集一般指专门用来控制调制解调器的指令集 该指令集最初由美国 Hayes 公
  • 【安装库】matlab2020b安装及百度网盘提速

    安装库 matlab2020b安装及百度网盘提速 matlab2020b安装 一 xff0c 下载 百度网盘 链接 xff1a https pan baidu com s 18iLFaAbWt8IntUefX3eWfA 提取码 xff1a
  • FreeRTOS系统中CPU使用率统计方法分析

    FreeRTOS系统中CPU使用率统计方法分析 基本概念 操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标 它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题 而CPU使用率也不能过高 xff0c 避免资源
  • NVIDIA GeForce 940M 设备是不可移动的,无法弹出或拔出问题解决办法

    上个月在新入手的笔记本上安装了一个CUDA的开发环境 xff0c 并选择安装了GeForce Experience工具 xff0c 前两天打开GeForce Experience工具浏览时 xff0c 工具提醒可以更新NVIDIA显卡驱动
  • 大学生职业规划要穿“营销三点式”

    我们现在就是这样的环境 xff0c 这样的 教育 xff0c 这样的模式 xff0c 这一切是无法改变的 xff0c 那你适应它吗 xff1f 不是 xff0c 你若适应它 xff0c 你只能茫然 xff01 为什么 xff1f 因为你适应

随机推荐

  • 网络与串口调试工具TCPCOM

    TCPCOM xff0c 网络与串口二合一调试助手 xff0c 将网络调试助手与串口调试助手合二为一 xff0c 绿色软件 xff0c 简单高效 软件特色 1 支持中英文双语言 xff0c 自动根据操作系统环境选择系统语言类型 xff1b
  • Cmake以及CmakeLists

    CMake使用 CMake1 gcc make和CMake的关系2 CMake一般使用流程2 1 生成构建系统2 2 执行构建 xff08 比如make xff09 xff0c 生成目标文件 xff1b 2 3 执行测试 安装或打包 3 C
  • 卡尔曼滤波公式及其详细推导(不涉及矩阵求导)

    卡尔曼滤波公式及推导 1 前言 卡尔曼滤波 Kalman Filter 是一种关于线性离散系统滤波问题的递推算法 其使用递推的形式对系统的状态进行估计 xff0c 以测量中产生的误差为依据对估计值进行校正 xff0c 使被估计的状态不断接近
  • Nmap常用命令及扫描原理

    Nmap常用参数 sS TCP SYN扫描 sU UDP扫描 sA ACK扫描 sW 窗口扫描 scanflags RSTSYNFIN 自定义扫描 O 检测目标操作系统类型 sV 检测目标上运行服务的版本 v 增加输出信息的详细程度 vv
  • pixhawk无人机结合openmv之精准降落

    pixhawk飞控与openmv之精准降落 一 精准降落概述二 精准降落流程三 代码逻辑流程四 总结反思改进 一 精准降落概述 1 概述 无人机在生产生活中逐渐获得更大的用途 xff0c 京东的物流无人机有望解决用户快递最后一分钟的问题 x
  • ROS Catkin 教程之 catkin_package(...) 到底在做什么?

    While looking at a CMakeLists txt file I was wondering the exact meaning of the CATKIN DEPENDS option of the catkin pack
  • c++中的sstream

    include lt sstream gt 头文件中主要包含了stringstream xff0c 可以用来进行数据格式转换 std stringstream ss 1 注意每当调用一次 lt lt 和 gt gt 后 xff0c stri
  • boost库之geometry

    Boost Geometry介绍 love code love life CSDN博客 boost geometry include lt boost assign hpp gt include lt boost geometry geom
  • Ali OSS

    常用工具 对象存储 OSS 阿里云
  • c++ 使用 matplotlibcpp

    xff08 1 xff09 拷贝matplotlibcpp h头文件到自己工程 GitHub lava matplotlib cpp Extremely simple yet powerful header only C 43 43 plo
  • Ubuntu16.04操作系统的安装

    由于今年才开始接触Linux操作系统 xff0c 并且一直在使用Ubuntu16 04 xff0c 已经在计算机上安装过很多次 xff0c 今天就在此总结一下Ubuntu16 04的安装 xff08 今天开到一位同事博客点击打开链接写的非常
  • 在Linux(Ubuntu)中使用终端编译并运行.c和.cpp文件

    首先要保证系统中安装了C语言和C 43 43 对应的编译器 xff1a gcc gt C g 43 43 gt C 43 43 1 c文件的编译与运行 xff08 1 xff09 c文件hello c代码如下 xff1a include l
  • ubuntu软件的编译安装方式

    在Linux操作系统上安装了好几天的VTK PCL OpenCV后来总结出了一条规律 xff0c 就是Linux下软件编译安装的方法 xff0c 困扰了自己好几天 xff0c 终于解决了 xff0c 所以乘热打铁现总结一下 xff0c 希望
  • C/C++字符串长度的计算

    char ch1 10 61 39 s 39 39 h 39 39 0 39 39 h 39 char ch2 61 34 sh 0h 34 char ch3 61 34 shh 34 xff08 1 xff09 strlen 统计字符串存
  • ROS-TF的使用(常用功能)

    tf 使用 人非人1991的博客 CSDN博客 一 TF中的数据格式 xff1a 这些数据格式全都是class 头文件 xff1a include lt tf transform datatypes h gt 基本上可以包含所有的tf数据类
  • STM32之MPU6050第一部分

    一 MPU6050基础介绍 MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 MPU605
  • 如何在Linux下运行Python脚本

    1 使用python的IDEL运行python 如果你的Linux安装了python Ctrl 43 Alt 43 T打开Terminal后输入指令 xff1a python 会出现 gt gt gt 这个时候就可以在里面输入python脚
  • 《《内存和性能优化》》给我带来的!

    内存和性能优化 这本书教会了我很多 xff01 有很多的东西自己知道 xff0c 但是确实想用语言表达出来很难 xff0c 下面就简单的发表我的一部分关于这本书的新的吧 xff01 我学会了在进行系统设计时要注意的问题 xff08 1 xf
  • java 中 Color类

    Color类 Color类是用来封装颜色的 xff0c 在上面的例子中多次用到 使用Color对象较为简单的方法是直接使用Color类提供的预定义的颜色 xff0c 像红色Color red 橙色Color orange等 xff1b 也可
  • C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符 xff1a 与 或 异或 取反 左移和右移 位运算是指按二进制进行的运算 在系统软件中 xff0c 常常需要处理二进制位的问题 C语言提供了6个位操作运算符 这些运算符只能用于整型操作数 xff0c 即只能用于带符号或无符号的