位运算及其应用详解

2023-11-18

http://blog.chinaunix.net/uid-21411227-id-1826986.html

 

一.逻辑运算符 

1.& 位与运算 

 1) 运算规则 

位与运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。例如:int型常量47进行位与运算的运算过程如下:

4=0000 0000 0000 0100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100

对于负数,按其补码进行运算。例如:例如:int型常量-47进行位与运算的运算过程如下: 4=1111 1111 1111 1100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100

2) 典型应用 

(1) 清零 

清零:快速对某一段数据单元的数据清零,即将其全部的二进制位为0。例如整型数a=321对其全部数据清零的操作为a=a&0x0 321=0000 0001 0100 0001 &0=0000 0000 0000 0000

= 0000 0000 0000 0000

(2) 获取一个数据的指定位 

获取一个数据的指定位。例如获得整型数a=的低八位数据的操作为a=a&0xFF321=

0000 0001 0100 0001 & 0xFF =0000 0000 1111 11111

= 0000 0000 0100 0001

获得整型数a=的高八位数据的操作为a=a&0xFF00==a&0XFF00==

321=0000 0001 0100 0001 & 0XFF00=1111 1111 0000 0000

= 0000 0001 0000 0000

(3)保留数据区的特定位  

保留数据区的特定位。例如获得整型数a=的第7-8位(从0开始)位的数据操作为: 110000000

321=0000 0001 0100 0001 & 384=0000 0001 1000 0000

=0000 0001 0000 0000

2. | 位或运算 

1) 运算规则 

位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。例如:int型常量57进行位或运算的表达式为5|7,结果如下:5= 0000 0000 0000 0101

| 7= 0000 0000 0000 0111=0000 0000 0000 0111

2) 主要用途 

(1) 设定一个数据的指定位。例如整型数a=321,将其低八位数据置为1的操作为a=a|0XFF321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111

逻辑运算符||与位或运算符|的区别 

条件“或”运算符 (||) 执行 bool 操作数的逻辑“或”运算,但仅在必要时才计算第二个操作数。 x || y , x | y 不同的是,如果 x  true,则不计算 y(因为不论 y 为何值,“或”操作的结果都为 true)。这被称作为“短路”计算。

3. ^ 位异或 

 1) 运算规则 

位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。例如:int型常量57进行位异或运算的表达式为5^7,结果如下:5=0000 0000 0000 0101^7=0000 0000 0000 0111

= 0000 0000 0000 0010

2) 典型应用 

 (1)定位翻转 

定位翻转:设定一个数据的指定位,将1换为00换为1。例如整型数a=321,,将其低八位数据进行翻位的操作为a=a^0XFF;

(2)数值交换 

数值交换。例如a=3,b=4。在例11-1中,无须引入第三个变量,利用位运算即可实现数据交换。以下的操作可以实现a,b两个数据的交换:

a=a^b;

b=b^a;

a=a^b;

4位非 

位非运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑非运算。

 

二.位移运算符

1.位左移

左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。例如int a,b;

a=5;

b=a<<2;

则b=20,分析过程如下:

(a)10=(5)10=(0000 0000 0000 0101)2

b=a<<2;

b=(0000 0000 0001 0100)2=(20)10

从上例可以看出位运算可以实现二倍乘运算。由于位移操作的运算速度比乘法的运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。

提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率

2.位右移

位右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数,高位补零。例如:

int (a)10=(5)10=(0000 0000 0000 0101)2

b=a>>2;

b=(0000 0000 0000 0001)2=(1)10

如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。如果符号位为0,则左边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。可以看出位右移运算,可以实现对除数为2的整除运算。

提示 将所有对2的整除运算转换为位移运算,可提高程序的运行效率

3.复合的位运算符

在C语言中还提供复合的位运算符,如下:

&=、!=、>>=、<<=和^=

例如:a&=0x11等价于 a= a&0x11,其他运算符以此类推。

不同类型的整数数据在进行混合类型的位运算时,按右端对齐原则进行处理,按数据长度大的数据进行处理,将数据长度小的数据左端补0或1。例如char a与int b进行位运算的时候,按int 进行处理,char a转化为整型数据,并在左端补0。

补位原则如下:

1) 对于有符号数据:如果a为正整数,则左端补0,如果a 为负数,则左端补1。

2) 对于无符号数据:在左端补0。

4.例子

例11-2 获得一个无符号数据从第p位开始的n位二进制数据。假设数据右端对齐,第0位二进制数在数据的最右端,获得的结果要求右对齐。

#include

/*getbits:获得从第p位开始的n位二进制数 */

unsigned int getbits(unsigned int x, unsigned int p, unsigned n)

{

unsigned int a;

unsigned int b;

a=x>>(p+1);

b=~(~0<<n);

return a&b;

}

提示 在某一平台进行程序开发时,首先要求了解此系统的基本数据类型的有效范围, 对涉及的位运算进行评估,特别是要对边界数据进行检测,确保计算正确。


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

位运算及其应用详解 的相关文章

  • 揭秘——STL空间配置器

    为什么要有空间配置器呢 这主要是从两个方面来考虑的 1 小块内存带来的内存碎片问题 单从分配的角度来看 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下就是堆中空闲的内存总量满足一个请求 但是这些空闲的块都不连续 导致任何一个单独
  • C语言/C++基础之跨年烟花程序代码(附源码)

    C语言 C 基础之跨年烟花程序代码 程序之美 前言 主体 运行效果 代码实例 结束语 程序之美 前言 元旦将至 新年将至 转眼间2022年即将过去 崭新的一年正向我们缓缓走来 风花雪夜新年临近 入冬寒意随风吹进 繁星点点缀满天际 黎明晨阳元
  • C++指向类成员(数据、函数)的指针

    指向 类 的成员的指针包含两种 指向 类 的数据成员的指针 指向 类 的成员函数的指针 注意 指向的是 类的成员 和类发生关系 指向非静态公有数据成员的指针 在定义时必须和类相关联 在使用时必须和对象相关联 1 指向类的数据成员的指针 1
  • 存储类型auto,static,extern,register的区别

    变量和函数的属性包括数据类型和数据的存储类别 存储类别指数据在内存中存储方式 静态和动态 包含auto static register extern四种 内存中 具体点来说内存分为三块 静态区 堆区 栈区 外部变量和全局变量存放在静态区 局
  • C语言/C++基础之奔跑的小人

    C语言 C 基础之奔跑的小人 程序之美 前言 主体 运行效果 代码示例一 运行结果 代码示例二 结束语 程序之美 前言 C语言实现的会动的小人 非常有意思 代码也比较简单 有兴趣的小伙伴 可以抽时间学习或者了解下 其实就是一些字符的拼接 最
  • 编程求解字符串中每个字母出现的次数

    统计在tt字符中 a 到 z 26各字母各自出现的次数 并依次放在pp所指的数组中 include
  • C++ operator == 的一些思考

    最近写代码的时候 需要重载 以前也没有进行过太多的思考 都是顺手就写了 在这里就总结一下 下面的代码是 应该是重载 用的最多的写法了 class Demo public Demo int a a a Demo bool operator c
  • std::thread的常用参数传递总结

    实参的生命周期 给std thread传递参数的时候要注意 参数是引用或者指针的情况下 要注意生命周期的问题 看代码 include
  • C/C++基础讲解(一百二十八)之经典篇(时间函数举例四剑客)

    C C 基础讲解 一百二十八 之经典篇 时间函数举例四剑客 程序之美 前言 很多时候 特别是刚步入大学的学子们 对于刚刚开展的计算机课程基本上是一团迷雾 想要弄明白其中的奥秘 真的要花费一些功夫 我和大家一样都是这么啃过来的 从不知到知知
  • lua学习笔记—table

    1 什么是table table是lua的一种数据结构 可以用来创建数组或映射 lua中的table使用的是关联型数组 关联数组的key值可以是除过nil之外任意类型的值 table的大小是不固定的 可以自己进行扩容 2 如何构造table
  • Unix时间戳和北京时间的相互转换(C语言实现 )

    一 问题背景 最近物联网项目中需要上传包含时间戳的设备数据到服务器平台 原本想把 年 月 日 时 分 秒 分别用一个 uint8 t 的数据类型去存储 即占用6个字节 但是在平台配置协议时 只有一种叫 Unix时间戳 的数据类型 Unix时
  • 八大排序算法时间空间复杂度分析

    作者 番茄焖鸡蛋 链接 https www nowcoder com discuss 200097 type 1 来源 牛客网 1 冒泡排序不管序列是怎样 都是要比较n n 1 2 次的 最好 最坏 平均时间复杂度都为O n 需要一个临时变
  • 函数参数是右值引用类型,能够接受什么样的参数输入

    假设我们有一个函数 class Data void func Data data 那么func能接收什么样的参数输入 情形一 Data data func data Error cannot bind Data lvalue to Data
  • malloc()与calloc区别

    http blog csdn net firecityplans article details 4490124 Both the malloc and the calloc functions are used to allocate d
  • C/C++:01. C过渡到C++

    文章目录 前言 1 C 和C的历史渊源 2 C 中的 class 和C中的 struct 3 C 命名空间 名字空间 详解 3 1 namespace 是C 中的关键字 用来定义一个命名空间 语法格式为 3 2 namespace 的使用规
  • 静态链接和动态链接的区别

    在理解静态和动态 共享 库链接之间的区别之前 让我们先看一个典型程序的生命周期 从编写源代码到执行它 首先使用任何程序员选择的编辑器以文本文件的形式编写程序 然后必须对其进行编译以将文本文件转换为机器可以理解和执行的目标代码 通常我们编写的
  • C语言数据类型32位和64位不同

    http blog csdn net kongdefei5000 article details 38866985 C语言编程需要注意的64位和32机器的区别 一 数据类型特别是int相关的类型在不同位数机器的平台下长度不同 C99标准并不
  • C/C++:02 1/2. 类和对象

    文章目录 前言 1 类的定义和对象的创建 类的定义 创建对象 访问类成员 使用对象指针 2 类的成员变量和成员函数 成员函数的定义 类体和类外定义成员函数的区别 3 C 类成员的访问权限以及类的封装 成员的访问限定 类的封装 6 C 构造函
  • GNU __attribute__ 机制

    http blog 163 com sunm lin blog static 9192142200741533038695
  • 位运算及其应用详解

    http blog chinaunix net uid 21411227 id 1826986 html 一 逻辑运算符 1 位与运算 1 运算规则 位与运算的实质是将参与运算的两个数据 按对应的二进制数逐位进行逻辑与运算 例如 int型常

随机推荐

  • Buffer Cache和Page Cache

    概念 如高速缓存 cache 产生的原理类似 在I O过程中 读取磁盘的速度相对内存读取速度要慢的多 因此为了能够加快处理数据的速度 需要将读取过的数据缓存在内存里 而这些缓存在内存里的数据就是高速缓冲区 buffer cache 下面简称
  • element tab-pane切换标签页 自动刷新

    解决方法 在子组件上加 v if
  • Kali如何配置静态IP,并且实现网络访问

    1 本地网络配置 我是使用VMware workstation的桥接网络 配置IP要根据对应的网络模式下对应的网络段进行配置 才能保证Kali与别的主机正常通信 桥接网络模式 我需要先看一下宿主机的网络IP地址 WIN r输入cmd 回车
  • 2013/1工作总结

    这个月抽时间看了C Primer一书 主要原因是没有基础知识直接看ATL的代码根本不可能 感想之一就是程序员也许必须学习一下C 只学习Java或者C 可能对语言的了解有限 造成对某些问题一直没有透彻的理解 当然了 最后发现还要好好学习理解编
  • TCP思维导图

  • GTest源码剖析(四)——TEST_P宏

    GTest源码剖析 TEST P宏 GTest源码剖析TEST P宏 TEST P宏用法 TestWithParam 类 1 TestWithParam 类定义 2 WithParamInterface 模版类定义 INSTANTIATE
  • 使用CURL上传图片至远程服务器(PHP >5.5)

    开头引入 use CURLFile curl文件上传 接收并上传 if FILES data file new CURLFile FILES file1 tmp name image jpeg FILES file1 name 文件流 fi
  • MVP和MVC的区别

    前提回顾 MVC架构 MVC就是Model View Controller 它们的作用是 它们之间的关系如下图所示 View传送指令到Controller Controller完成业务逻辑后 改变Model的状态 Model将新的数据发送到
  • RPC 开发系列一:RPC 基本介绍

    一 什么是 RPC RPC 的全称是 Remote Procedure Call 即远程过程调用 功能 屏蔽远程调用跟本地调用的区别 让我们感觉就是调用项目内的方法 隐藏底层网络通信的复杂性 让我们更专注于业务逻辑 二 RPC 通信流程 发
  • sourceforge文件下载过慢之原始解决方法

    近日 从sourceforge下载文件超线慢 从下午一直下载到网上11点多 居然下不完39MB的资料 百度一下方法有很多 却一个都没成功 比如 http sourceforge mirrorservice org 更是没用 部份有用 因为不
  • __cdecl __stdcall __fastcall区别

    一 三者区别一览表 stdcall cdecl fastcall 参数传递方式 右 gt 左 压栈 右 gt 左 压栈 左边开始的两个不大于4字节 DWORD 的参数分别放在ECX和EDX寄存器 其余的参数仍旧自右向左压栈传送 清理栈方 被
  • 【逆波兰表达式求值】

    逆波兰表达式求值 给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 注意 有效的算符为 和 每个操作数 运算对象 都可以是一个整数或者另一个表达式 两个整数之间的除
  • 【SpringBoot框架篇】31.基于分布式锁或xxx-job实现分布式任务调度

    文章目录 1 简介 2 分布式锁实现 2 1 引用依赖 2 2 定义分布式锁注解 2 3 配置切入点和获取锁释放锁逻辑 2 4 测试任务 3 使用分布式任务调度平台xxx job 3 1 下载源码并运行项目 3 2 springBoot项目
  • 微信小程序之授权登录篇

    之前微信授权登录时是直接可以通过getUserInfo接口 弹出授权弹窗 由于微信官方修改了 getUserInfo 接口 所以现在无法实现一进入微信小程序就弹出授权窗口 只能通过 button 去触发 微信的官方解释如下 为优化用户体验
  • React 初识之Umi项目搭建实战

    一 创建项目 创建之前需要安装 Node js 和 npm yarn 这俩个环境 在WebStorm里面创建一个项目 输入命令 yarn create umi 弹出选项 这里我们选择第二项APP 选择是否使用typescript 这里选no
  • JavaScript常用事件讲解

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 事件流 事件流描述的是从页面接收事件的顺序 事件冒泡 事件开始由最具体的元素接收
  • c语言统计各类字符个数

    输入十个字符 统计其中英文字母 空格或回车 数字字符和其他字符的个数 7 43 统计字符分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 本题要求编写程序 输入10个字符 统计其中英文字母 空格或回车 数字字符和其他字符的
  • mysql的索引 优化 前导列

    组合索引之 前导列 1 对于where子句中出现的列要想索引生效 会有一些限制 这就和前导列有关 2 所谓前导列 就是在创建复合索引语句的第一列或者连续的多列 比如通过 CREATE INDEX comp ind ON table1 x y
  • 第一个Node程序,Node入门

    第一个Node程序 在前面的所有内容中 我们编写的JavaScript代码都是在浏览器中运行的 因此 我们可以直接在浏览器中敲代码 然后直接运行 从本章开始 我们编写的JavaScript代码将不能在浏览器环境中执行了 而是在Node环境中
  • 位运算及其应用详解

    http blog chinaunix net uid 21411227 id 1826986 html 一 逻辑运算符 1 位与运算 1 运算规则 位与运算的实质是将参与运算的两个数据 按对应的二进制数逐位进行逻辑与运算 例如 int型常