位运算:按位与、按位或、按位异或、按位左移、按位右移

2023-05-16

目录

一、基础知识补充

    (1)位运算

    (2)二进制的详细操作

二、位运算

    (1)按位与(&)

    (2)按位或(|)

    (3)按位异或(^)

      (4)按位左移(<<)

    (5)按位右移(>>)

三、位运算例题

    题目描述:

    题解:

四、共勉


一、基础知识补充

    (1)位运算

    位运算符要比一般的算术运算符速度要快,而且可以实现一些算术运算不能实现的功能(文章后面会举例子)。如果在完成代码的时候需要做到开发效率高,位运算是必不可少的。位运算用来对二进制位进行操作,包括:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>) 。

    (2)二进制的详细操作

    在进行位运算的时候,会用到大量的二进制源码、反码、补码,所以有需要的朋友可以看看我的上一篇文章哦!!!

    文章的链接:  http://t.csdn.cn/dasNJ

二、位运算

    (1)按位与(&)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:将整数从十进制转化为二进制数,上下比较,有零则零 ,两个都是 1 才是 1。

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:将 3 & (-5)

// int 为整型4个字节有32个bit位
int a = 3 ;  // 00000000 00000000 00000000 000000011   正数,源码=反码=补码
int b = -5 ; // 10000000 00000000 00000000 000000101   -5的源码
             // 11111111 11111111 11111111 111111010   -5的反码
             // 11111111 11111111 11111111 111111011   -5的补码

int c = a & b ;  //按位与:上下比较,有零则零,两个都为 1 才是 1

             // 00000000 00000000 00000000 00000011   3的补码
             // 11111111 11111111 11111111 11111011   -5的补码

     最终结果// 00000000 00000000 00000000 00000011   ----(3)整数,源码=反码=补码

    (2)按位或(|)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:上下比较有 1 则为 1,两个都是 0 才是 0

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:3 |  (-5)

// int 为整型有4个字节,32个bit位
int a = 3 ;  // 00000000 00000000 00000000 00000011   正数,源码=反码=补码
int b = -5 ; // 10000000 00000000 00000000 00000101   -5的源码
             // 11111111 11111111 11111111 11111010   -5的反码
             // 11111111 11111111 11111111 11111011   -5的补码

int c = a | b ;    //按位或:上下比较,有 1 则 1,两个都是 0 才是 0

              // 11111111 11111111 11111111 11111011   -5的补码
              // 00000000 00000000 00000000 00000011   3的补码

      最终结果// 11111111 11111111 11111111 11111011  为负数,是补码
             // 11111111 11111111 11111111 11111010   是反码,补码-1
             // 10000000 00000000 00000000 00000101   是源码,各个位按位取反-----(-5)

    (3)按位异或(^)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:上下比较,相同为 0 ,相异为 1 

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例: 3  ^ (-5)

// int 为整型有4个字节32个bit位
int a = 3 ;  // 00000000 00000000 00000000 00000011  正数,源码=反码=补码
int b = -5 ; // 10000000 00000000 00000000 00000101  负数,(-5)的源码
             // 11111111 11111111 11111111 11111010  -5的反码
             // 11111111 11111111 11111111 11111011  -5的补码

int c = a ^ b ; //按位异或:上下比较,相同为0,相异为1


// 11111111 11111111 11111111 11111011  -5的补码
// 00000000 00000000 00000000 00000011  3的补码


//异或 :11111111 11111111 11111111 11111000  负数,补码
      // 11111111 11111111 11111111 11110111  反码
      // 10000000 00000000 00000000 00001000  源码-----(-8)

      (4)按位左移(<<)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:把二进制数向左移动一位,左边溢出的丢弃,右边补零

    3. 编码运算:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:将 a = 4 左移一位

// int 为整型,有4个字节,32个bit位
int a = 4 ;       // 00000000 00000000 00000000 00000100,正数,源码=反码=补码
int b = a << 1 ;  // 把a左移一位,左边丢弃,右边补零
                  // 00000000 00000000 00000000 00001000 ----(8)

    (5)按位右移(>>)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:把二进制数向右移动一位,右边丢弃,左边补原符号位

    3. 编码运算:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

int a = -4 ; // 10000000 00000000 00000000 00000100 负数,源码
             // 11111111 11111111 11111111 11111011  -4的反码
             // 11111111 11111111 11111111 11111100  -4的补码
int b = >> 1 ; // 把b向右移动一位,右边丢弃,左边补原符号位
               // 11111111 11111111 11111111 11111110  负数,补码
               // 11111111 11111111 11111111 11111101  反码
               // 10000000 00000000 00000000 00000010  源码----(-2)

    此时我们可以发现一个整数,左移有乘2的效果,右移有除二的效果。

三、位运算例题

    题目描述:

    不创建第三变量,进行变量 a , b 的数值交换

    题解:

    (方法一):简单数位运算,但是不能满足所有需求

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("a=%d b=%d\n", a, b);
	return 0;
}

    若 a , b 两个数相加的和刚好超过 int 的取值范围,方法一就不可行。

    (方法二):位运算,简单,高效

//找规律
//3^3=0
//5^5=0
//3^5^5=3
//3^5^3=5
//3^5=6
// 异或支持交换律

#include <stdio.h>
int main()
{
	int a = 8;
	int b = 9;
	int z;
	z = a ^ b;  //设置密码z
	b = z ^ b;  //b=a^b^b=a
	a = z ^ a; //a=a^b^a=b
	printf("a=%d b=%d\n", a, b);
	return 0;
}

四、共勉

    这篇文章就是我对位运算的理解,如果大家有什么问题可以在评论区说出来哦,我们共同进步,一起加油!!!

 

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

位运算:按位与、按位或、按位异或、按位左移、按位右移 的相关文章

  • Ubuntu Linux通过apt库安装WireShark

    华灯璀璨1 秒前 回复 根据文章Ubuntu安装wireshark 小菜鸟要高飞的博客 CSDN博客写成了脚本 脚本如下 xff1a bin bash 编译环境配置 sudo apt get install bison flex libpc
  • (C++)1002 A+B for Polynomials

    笔记 xff1a 1 两个不为0的数相加可能为0 2 浮点数的比较方法 3 输出的时候格式怎么办 本题空格放在哪有门道 4 不需要三个数组 xff0c 一个就可以了 xff0c 第二个 数组 输入的时候直接加在第一个上面 include l
  • 如何轻松把mysql数据表对齐?!正解在这儿

    初学数据库 xff0c 很多小白就会发现自己的数据表总是对不齐 xff1a 怎么对齐 xff1f 只需要输入时 xff1a charset gbk xff1b 就ok了 简单易操作 xff0c 别问我怎么知道的 xff0c 百度是个好东西
  • websocket+定时任务实现实时推送

    websocket 43 定时任务实现实时推送 TaskScheduler定时任务实现websocket 43 定时任务实时推送 有时候业务要求websocket连接后 xff0c 服务端实时每隔一段时间就将数据推送给客户端进行响应 xff
  • Linux系统下运行bash脚本提示/usr/bin/env: ‘bash\r’: No such file or directory

    1 问题现象 在Linux系统中使用 searchsploit 启动 xff0c 运行失败 xff0c 并报错提示如下所示 xff1a 2 错误原因 xff1a 主要是应用bash后面多了 r 字符的原因 xff0c 在Linux终端下 x
  • 面试:每发送一个http请求就要建立一个tcp连接吗(非持久连接/持久连接)

    非持久连接 xff1a HTTP 1 0 中 的首部字段Connection 默认值为 close xff0c 即每次请求都会重新建立和断开 TCP 连接 持久连接 xff1a HTTP 1 1 中 的首部字段Connection 默认值为
  • 实例:用C#.NET手把手教你做微信公众号开发(16)--事件消息处理之点击菜单2

    微信用户点击菜单时 xff0c 会通过微信服务器转发两种事件给你的服务器 xff0c 一种是拉取消息时的事件推送 xff1b 另一种是跳转链接时的事件推送 上篇讲了第一种 xff0c 本篇先讲第二种 一 消息格式 推送XML数据包示例 xf
  • 合理清除AlibabaProtect进程

    1 在 任务管理器 的 进程选项中 xff0c 找到AlibabaProtect进程 xff0c 单击后 xff0c 右键选择 打开文件所在位置 xff0c 找到该进程对应文件所在位置 xff0c 并将其上级目录做成 桌面快捷方式 xff0
  • Sublime Text 4安装使用(完整教程)

    Sublime Text 4安装使用 安装使用语言汉化 OK啦 xff0c 觉得有用的点个赞吧 xff01 xff01 xff01 写这篇博客的意义希望能够将我走过的路 踩过的坑记录下来 在后来在遇到的时候能够更好的翻阅 未经允许 xff0
  • Xlaunch启动后无法显示图形界面,提示connection refused

    解决方案 xff1a 重启远程端
  • 【PR】零基础快速入门教程

    PR 零基础快速入门教程 PR xff08 Premiere xff09 能做什么 xff1f PR欢迎界面及新建项目工作区及窗口说明导入文件建立序列视频剪辑添加字幕导出视频 使用软件 xff1a Premiere2020 新年卷起来 xf
  • 【PR】源窗口

    PR 源窗口 源窗口粗剪源窗口按钮功能标记按钮出入点相关插入与覆盖插入覆盖 导出帧 使用软件 xff1a Premiere2020 源窗口粗剪 我们手上可能有一些很长的视频 xff0c 但是我就想要其中的几段 xff0c 这个时候粗剪就很方
  • 【PR】时间轴窗口

    PR 时间轴窗口 时间轴窗口工具按钮 视频轨道切换轨道输出切换同步锁定目标切换轨道锁定轨道对插入和覆盖进行源修补 工具按钮 音频轨道静音轨道独奏轨道画外音录制 时间轴窗口基础操作添加轨道查看完成视频和音频缩放轨道删除轨道 添加关键帧 使用软
  • 【PR】来,一起做一个简单的剪辑视频吧

    PR 来 xff0c 一起做一个简单的剪辑视频吧 前言新建项目导入素材创建序列裁剪视频视频导入序列 图片背景音频处理多视频素材处理添加字幕导出上传学了上面能做到什么程度 xff1f 可以看一下我用上面的方法做出成品 新手教程哈 xff0c
  • 【PR】视频剪裁

    PR 视频剪裁 把素材文件导入PR问题1 xff1a 删除多余部分 xff08 主要是录制范围 xff09 导出视频 xff08 问题1解决方案看我 xff09 问题2 导出的视频还有黑边导出视频 xff08 问题2解决方案看我 xff09

随机推荐

  • 【PR】图片处理

    PR 图片处理 导入图片将图片文件拖拽进时间轴点击图片选择效果 xff08 时间轴上的那个条 xff09 改变图片位置修改图片大小图片不透明度旋转与锚点 xff08 视频层 xff09 图层 PR不光能导入视频 xff0c 还可以导入图片
  • 【PR】音频处理及过度效果

    PR 音频处理及过度效果 导入音频插入时间轴中的A轨道 xff08 声音轨道 xff09 音频处理调整音量 音频剪贴音频过度效果淡入 xff0c 淡出 xff0c 过度淡入淡出过度 工具按钮 音频轨道 xff08 不充内容 xff0c 可以
  • 实例:用C#.NET手把手教你做微信公众号开发(17)--公众号主动给粉丝发信息之模板消息

    前面讲了那么多 xff0c 都是微信用户主动向公众号发送信息或某个操作触发公众号响应并给予用户回复 如果在微信用户没有主动发起互动的情况下 xff0c 公众号应该如何向微信用户发送消息呢 xff1f 本篇给出一种解决方案 xff1a 模板消
  • 【PR】视频转场与视频粗剪

    PR 视频转场与视频粗剪 视频转场转场使用方法 粗剪与标记 xff08 多个视频合并的小技巧 xff0c 可以不看 xff09 粗剪标注 今天我们来搞一下视频 xff0c 主要是搞一下转场效果 转场 xff1a 让不同场景的画面间过渡更加自
  • 【PR】字幕处理

    PR 字幕处理 添加字幕新建字幕基础设置多字幕添加 其他调整基础效果 效果控件 字幕特效 PR2022版本有字幕插件 xff0c 可以更轻松的处理字幕 我用的是PR2020 xff0c 没有这个功能 xff0c 只能一个一个添加 xff0c
  • 【外设零基础通用教程】GPIO 上

    外设零基础通用教程 GPIO 上 视频 文章结构外设 xff1a GPIO代码编写GPIO输入方法GPIO输出方法 视频地址 xff1a 咸鱼的外设通用教程之GPIO 本教程适合 xff1a 硬件零基础纯小白 上手了硬件不知从何开始 xff
  • 【外设零基础通用教程】GPIO 下

    外设零基础通用教程 GPIO 下 使用方法GPIO 值输入读取值输出设置值 GPIO输入输出应用GPIO输入应用GPIO输出应用文档使用 理论补充输出方式推挽输出开漏输出 上篇连接 xff1a 外设零基础通用教程 GPIO 上 xff0c
  • 硬件外设使用方法——GPIO

    硬件外设使用 GPIO用法 GPIO基本概念GPIO应用pyb与micropython什么是pyb什么是micropythonpyb与micropython关系 GPIO在micropython中的用法什么是pyb库pyb库中的GPIO用法
  • 【硬件外设使用】——ADC

    硬件外设使用 ADC ADC基本概念ADC使用方法pyb adcmachine adc ADC可用的传感器 ADC基本概念 ADC是模拟数字转换器 xff08 Analog to Digital Converter xff09 的缩写 xf
  • 【硬件外设使用】——DAC

    硬件外设使用 DAC DAC基本概念DAC使用方法pyb dacmachine dac DAC可用的传感器 DAC基本概念 DAC是数字模拟转换器 xff08 Digital to Analog Converter xff09 xff08
  • 【硬件外设使用】——PWM

    硬件外设使用 PWM PWM基本概念PWM使用方法pyb pwm方法属性 machine pwm方法属性 PWM可用的传感器 PWM基本概念 PWM是脉冲宽度调制 xff08 Pulse Width Modulation xff09 的缩写
  • 【硬件外设使用】——I2C

    硬件外设使用 I2C I2C基本概念I2C通信协议I2C使用方法pyb i2cmachine i2c I2C可用的传感器 I2C基本概念 I2C是 34 Inter Integrated Circuit 34 的缩写 xff0c 也被称为T
  • 【硬件外设使用】——SPI

    硬件外设使用 SPI SPI基本概念SPI通信协议SPI使用方法pyb spimachine spi SPI可用的传感器 SPI基本概念 SPI是一种串行端口通信接口 xff0c 它是一种同步的全双工协议 xff0c 用于在数字电路之间传输
  • 实例:用C#.NET手把手教你做微信公众号开发(18)--使用微信支付给粉丝发红包

    前面讲的所有都没有涉及到钱 xff0c 一旦关联到钱都是非常敏感的 xff0c 所以开通微信支付的过程和配置过程相对比较繁琐 xff0c 本篇给出主要入口 xff0c 因篇幅原因一篇文章讲不太细 xff0c 但已足以帮你解决问题 xff0c
  • 【硬件外设使用】——UART

    硬件外设使用 UART UART基本概念UART通信协议UART使用方法pyb uartmachine uart UART 可用的传感器 UART基本概念 UART全称为Universal Asynchronous Receiver Tra
  • 【硬件外设使用】——can

    硬件外设使用 can can基本概念can 通讯can使用方法pyb can can可用的传感器 can基本概念 CAN是Controller Area Network的缩写 xff0c 即控制器局域网 它是一种多主机串行通信协议 xff0
  • 【计算机是怎么跑起来的】基础:计算机三大原则

    计算机是怎么跑起来的 基础 xff1a 计算机三大原则 计算机的三个根本性基础1 计算机是执行输入 xff0c 运算 xff0c 输出的机器输入 xff0c 运算 xff0c 输出 2 软件是指令和数据的集合指令数据 3 计算机的处理方式有
  • 5GC中名词解释

    5GC中常见名词解释 5GC各网元名词解释 UPF xff0c User Plane Function 用户平面功能PCF xff0c Policy Control Function 策略控制功能AMF xff0c Access and M
  • iOS Swift No.1 基础部分 - 常量与变量

    第一章 基础部分 1 Constants and Variables 1 1 Declaring Constants and Variables 声明常量和变量 span class token comment 声明常量 span span
  • 位运算:按位与、按位或、按位异或、按位左移、按位右移

    目录 一 基础知识补充 xff08 1 xff09 位运算 xff08 2 xff09 二进制的详细操作 二 位运算 xff08 1 xff09 按位与 xff08 amp xff09 xff08 2 xff09 按位或 xff08 xff