移位运算

2023-10-27

         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
                                    <div id="content_views" class="markdown_views">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <h1 id="位运算总结"><a name="t0"></a>位运算总结</h1>

原文

一、位运算应用口诀

清零取位要用与,某位置一可用或
若要取反和交换,轻轻松松用异或

二、移位运算

  1. 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
  2. ‘<<’左移:右边空出的位置补0,其值相当于乘以2。
  3. ‘>>’右移:左边空出的位,如果是正数则补0,若为负数则补0或1,取决于所用的计算机系统OS X中补1。其值相当于除以2。

三、位运算符的应用(原操作数s掩码mask)

  1. 按位与&
    • 清零特定位(mask中特定位置0,其他位为1,s = s&mask)
    • 取某数中指定位(mask中特定位置1,其他位为0,s = s&mask)
  2. 按位或|
    常用来将原操作数某些位置1,其他位不变。(mask中特定位置1,其他位为0 s = s|mask)
  3. 位异或^
    • 使特定位的值取反(mask中特定位置1,其他位为0,s = s^mask)
    • 不引入第三变量,交换两个变量的值(设a = a1,b = b1,a^b^a = b)

四、应用举例

  1. 判断整数a是奇数还是偶数
    • a&1 = 0 偶数
    • a&1 = 1 奇数
  2. 取整数a的第k位(k = 0,1,2,…len(str(a))),即a>>k&1
  3. 将int型变量a的第k位清0,即a=a&~(1<
        int average(int x, int y)   //返回X,Y 的平均值
        {   
              return (x&y)+((x^y)>>1);
        }
 
 
 
 
  • 1
  • 2
  • 3
  • 4
  1. 判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
    boolean power2(int x)
    {
    return ((x&(x-1))==0)&&(x!=0);
    }

9、不用temp交换两个整数

    void swap(int x , int y)
    {
         x ^= y;
         y ^= x;
         x ^= y;
    }

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

10、计算绝对值

    int abs( int x )
    {
         int y ;
         y = x >> 31 ;
         return (x^y)-y ;        //or: (x+y)^y
     }

11、取模运算转化成位运算 (在不产生溢出的情况下)
        a % (2^n) 等价于 a & (2^n - 1)
12、乘法运算转化成位运算 (在不产生溢出的情况下)
        a * (2^n) 等价于 a<< n
13、除法运算转化成位运算 (在不产生溢出的情况下)
        a / (2^n) 等价于 a>> n
        例: 12/8 == 12>>3
14、a % 2 等价于 a & 1       
15、if (x == a) x= b;

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

   else x= a;
   等价于 x= a ^ b ^ x;
16、x 的相反数表示为 (~x+1)

比较浅显的来说,左移n位就是乘以2的n次方,右移n位就是除以2的n次方。具体细节如下:

C语言里的左移和右移运算
2006-09-30 13:52

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:

int i = 1;
i = i << 2; //把i里的值左移2位

也就是说,1的2进制是000…0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000…0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的01000000…0000
// 40000000 共八位,故用二进制表示为32位。
i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000…0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢? (这个真不知道?????????)
在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.

左移里一个比较特殊的情况是当左移的位数(>>32)超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 左移1位,i变成2
j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.

总之左移就是: 丢弃最高位,0补最低位(不懂????)

再说右移,明白了左移的道理,那么右移就比较好理解了.

右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

 负数10100110 >>5(假设字长为8位),则得到的是  11111101  //前面三个101往右移5位;

 
 
 
 
  • 1

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

unsigned char a;
a=1; //0b00000001
a<<=1; //0b00000010 a左移1位等效于a=a*2
a<<=2; //0b00001000 a左移2位等效于a=a*2的2次方(4)
a<<=3; //0b01000000 a左移1位等效于a=a*2的3次方(8)
a<<=1; //0b10000010 a左移1位等效于a=a*2
a<<=1; //0b00000000 a再次左移1位后溢出了,结果变成0了

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

移位运算 的相关文章

  • 2 RocketMQ Server安装

    RocketMQ依赖Java环境 要求有JDK 1 8以上版本 支持Windows和Linux平台 支持源码方式安装和使用已经编译好的安装包安装 我们用windows平台安装RocketMQ Server编译好的安装包 来讲解RocketM
  • 【Python打印图形问题】利用print打印一些规则的图形(通过特殊符号比如*和空格组成)

    目录 1 输出菱形 2 打印空心三角形 n 3 打印如下的空心菱形 n为边长 4 九九乘法表 1 输出菱形 描述 输入n 输出2 n 1行的菱形图形 输入 输出 示例1 2
  • 总结:常见的攻击服务器的手段

    一 拒绝服务 这是常见的一种方式 即DOS攻击或DDOS攻击 通过向某个站点服务器反复发送请求 导致无法承载大量的请求而 拒绝服务 被攻击的原因 服务器带宽不足 不能挡住攻击者的攻击流量 案例 SYN Flood 简单说一下tcp三次握手
  • matlab中查找y1与y2相近点,matlab – 寻找附近的邻居

    您可以通过使用 DelaunayTri class及其 edges和 nearestNeighbor方法来实现您的第一个想法 即选择其中点落在与Voronoi线交点的边 这里有一个x和y值的10个随机对的例子 x rand 10 1 Ran
  • tshark查看、指定网卡

    查看网卡 sudo tshark D 或是使用 ifconfig a 可以查看网卡与数据包的情况 指定网卡 sudo tshark i 网卡 例 sudo tshark i ens33
  • 05-ResultMap

    当我们在使用 MyBatis 进行数据库查询的时候 查询结果往往是以单个数据对象或一个对象列表的形式呈现的 这时候 我们可以使用 ResultMap 来告诉 MyBatis 如何将数据库查询结果映射成 Java 对象 ResultMap 是
  • C/C++中计算程序运行时间

    参考博客 C C 计算程序运行时间的代码 蔚蓝星辰mic的博客 CSDN博客 c计算程序运行时间 include
  • mysql修改表操作(DDL)

    1 修改表名 alter table 表名 rename 新表名 2 添加表字段 1 默认加到最后 alter table 表名 add 新字段 类型 字段完整性约束条件 2 指定加到某个字段之后 alter table 表名 add 新字
  • k8s-kubernetes错误集锦总结-环境搭建篇

    k8s kubernetes错误集锦 随笔 学习总结 写给以后的自己看的 所以文章会比较随意 root centos7 k8s auto kubectl get nodes The connection to the server loca
  • 【华为OD机试】太阳能板最大面积【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 给航天器一侧加装长方形或正方形的太阳能板 图中的红色斜线区域 需要先安装两个支柱 图中的黑色竖条 再在支柱的中间部分固定太阳能板 但航天器不同位置的支柱长度不同 太阳

随机推荐

  • NPOI组件下载、引用、基本使用

    前言 NPOI是一组dll库文件 也叫COM组件 对于Excel表格用代码操作 主要有三种方式 1 OLEDB类似于数据库的操作 需要安装AccessDataBase数据库引擎 2 Office组件 也是引用dll文件 依赖Office软件
  • openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing det

    报错 此错误消息表明您已达到API的最大月支出 硬限制 这意味着您已经消耗了分配给计划的所有积分或单位 并且已经达到计费周期的限制 这种情况可能有几个原因 例如 您使用的是高容量或复杂的服务 每个请求需要消耗大量的信用额度或单位 您使用的是
  • OBS推流工具介绍及桌面录屏推流功能实现

    OBS推流工具介绍及桌面录屏推流功能实现 文章目录 OBS推流工具介绍及桌面录屏推流功能实现 1 OBS工具介绍 2 OBS工具安装及简单使用 2 1 安装步骤 2 2 简单使用介绍 3 OBS实现桌面录屏推流工具实现 4 总结 流媒体开发
  • 第十二届蓝桥杯c++b组

    问题 New Online Judge 1 空间 P1555 蓝桥杯2021初赛 空间 New Online Judge ecustacm cn 1MB 1024KB 1KB 1024B byte字节 1B byte字节 8b bit位 2
  • OpenGL平台上的Teapot绘制与渲染(代码详细注释)

    include
  • dcdc芯片效率不高的原因_DCDC变换器轻载时三种工作模式

    目前高频高效的DCDC变换器的应用越来越广泛 通常在满输出负载时 DCDC变换器工作于CCM即连续电流模式 但是 当系统的输出负载从满载到轻载然后到空载变化的过程中 系统的工作模式也会发生相应的改变 下面以降压型Buck变换器为例说明DCD
  • Qt6 for Android 环境搭建

    作者 一去 二三里 个人微信号 iwaleon 微信公众号 高效程序员 说起 Qt 各平台的开发环境搭建 最难的当属 Android 环境 因为要配置的东西比较多 而且配置过程很容易出现问题 例如 JDK Android SDK NDK 等
  • Python调用Stata

    一 软件要求 python3 Stata 17 PyCharm 二 环境配置 2 1 stata基础配置 stata激活 无论是MP版本 还是SE版本 都需要进行证书激活 即在stata安装目录下 存在LIC文件 stata中配置pytho
  • 202324读书笔记

    202323读书笔记 一枝瘦骨写空山 金农画的金石气 以一枝瘦骨 写空山之妙 一枝瘦骨写空山 金农画的金石气 文人画的真性 作者朱良志 荷风四面 人在当中 消受这世界的清凉 也回应这世界的灵韵 生命智慧 是金农之绘画艺术具有长久生命力的基点
  • Think in java书籍阅读小结

    一 博客说明 本篇博客为本人看完think in java这本书后 个人查漏补缺的一些知识点 记录下来作为笔记使用 二 变量初始化顺序 在一个类里 变量初始化的顺序是由变量在类内的定义顺序决定的 即使变量定义大量遍布于方法定义的后面 那些变
  • python如何处理表格,将其转换为CSV,直接编辑或调用CSV模块

    python如何处理表格 将其转换为CSV 直接编辑或调用CSV模块 1 csv文件优点 2 csv 与 txt 3 写入csv文件方法 3 1 方法一 直接写入 3 2 方法二 调用CSV模块 4 读取CSV文件 pycharm 工作路径
  • Python的随机矩阵生成

    导入模块 random模块 numpy中的random函数 python中有两个模块可以生成随机数 该博客以的numpy模块为例进行生成随机数 因为矩阵要生成大量的随机数据 故推荐使用numpy模块生成随机数 生成随机数 以矩阵为例 生成随
  • 将未经安全技术处理的计算机,4322【标准答案】单选题 1. 将未经安全技术处理的退出使用的涉密计算机、涉密存储设备____或者改作其他用途的。依法给予处分;构成犯罪的,依法追究刑事责任。 A: 赠送...

    lt gt 标准答案 单选题 1 将未经安全技术处理的退出使用的涉密计算机 涉密存储设备 或者改作其他用途的 依法给予处分 构成犯罪的 依法追究刑事责任 A 赠送 B 出售 C 丢弃 D 以上都是 习题 单选题 1 将未经安全技术处理的退出
  • vscode里面配置Git默认终端

    文章目录 前言 一 为什么VsCode的终端默认文件选择项里面会没有Git的终端配置 二 配置默认Git终端 1 打开settings json文件 2 将配置找到 小编亲测 3 找到Git路径 4 结果 总结 废话很多 看完就对能行 前言
  • OpenCV-Python绑定如何工作及如何扩展新模块到Python

    OpenCV Python绑定如何工作及如何扩展新模块到Python 1 OpenCV Python 绑定的基本版本 2 如何将OpenCV的新模块扩展到 Python 参考 这篇博客将介绍 OpenCV Python 绑定是如何生成的以及
  • 127.0.0.1拒绝了我们的连接请求

    问题描述 浏览器打不开127 0 0 1 显示拒绝连接 试着ping了一下 需要指明一点 1是ipv6的地址 但正常localhost应该指向127 0 0 1 使用Windows自带的网络诊断工具 出现了 127 0 0 1未设置为接受端
  • 【毕业设计】便携式STM32的红外信号分析仪 - 单片机 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • C#开发之——GetType方法(6.5)

    一 概述 C 中GetType方法用于获取当前实例的类型 返回值为System Type类型 C 中GetType方法不含有任何参数 是非静态方法 使用任何对象都能直接调用该方法 二 实例 创建字符串类型的变量 整数类型的变量以及Stude
  • 傻瓜式3分钟理解:工厂模式(简单工厂+工厂方法+抽象工厂)

    一 给我一句话概括 简单工厂 工厂类中 根据条件决定一个接口由哪个具体产品类来实现 工厂方法 创建多个工厂类 各个工厂类中 都对应一个获得接口A实例的方法 用户决定使用哪个工厂 抽象工厂 对工厂方法进行扩展 各个工厂类中 再增加一个获得接口
  • 移位运算

    div class markdown views div