关于位运算

[算法]——常见位运算总结 本文介绍了常见的位运算及其组合,并辅以例题帮助读者更好地理解和应用 阅读详情

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

移位运算
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
2 “<<” 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
3 “>>”右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。
4 “>>>”运算符,右边的位被挤掉,对于左边移出的空位一概补上0。

位运算符的应用 (源操作数s 掩码mask)
(1) 按位与– &
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
(2) 按位或– |
常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
(3) 位异或– ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)
目标 操作 操作后状态
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1

二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//无符号x,y比较
x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较

应用举例
(1) 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 将int型变量a的第k位清0,即a=a&~(1<

#include <stdio.h>

//设置x的第y位为1

#define setbit(x,y) (x)|=(1<<(y-1))

//得到x的第y位的值

#define BitGet(Number,pos) ((Number)>>(pos-1)&1)

//打印x的值

#define print(x) printf("%d\n",x)

//将整数(4个字节)循环右移动k位

#define Rot(a,k) ((a)<<(k)|(a)>>(32-k))

//判断a是否为2的幂次数

#define POW2(a) ((((a)&(a-1))==0)&&(a!=0))
#define OPPX(x) (~(x)+1)

//返回X,Y 的平均值

int average(int x, int y)
{    
return (x&y)+((x^y)>>1);
}

//判断a是否为2的幂次数

bool power2(int x)
{
    return ((x&(x-1))==0)&&(x!=0);
}

//x与y互换

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

int main()
{
int a=0x000D;
print(a);
int b=BitGet(a,2);
print(b);

setbit(a,2);
print(a);
print(BitGet(a,2));
int c=Rot(a,33);
print(c);
print(BitGet(c,5));
printf("8+5=%d\n",average(8,692));

int i;
for (i=0;i<1000;i++)
{
   if (POW2(i))//调用power2(i)
    {
     printf("%-5d",i);
    }
}
printf("\n");

int x=10,y=90;
swap(x,y);
print(x);
print(y);
print(OPPX(-705));
return 0;
}

实例

功能 ¦ 示例 ¦ 位运算
———————-+—————————+——————–
去掉最后一位 ¦ (101101->10110) ¦ x >> 1
在最后加一个0 ¦ (101101->1011010) ¦ x < < 1
在最后加一个1 ¦ (101101->1011011) ¦ x < < 1+1
把最后一位变成1 ¦ (101100->101101) ¦ x ¦ 1
把最后一位变成0 ¦ (101101->101100) ¦ x ¦ 1-1
最后一位取反 ¦ (101101->101100) ¦ x ^ 1
把右数第k位变成1 ¦ (101001->101101,k=3) ¦ x ¦ (1 < < (k-1))
把右数第k位变成0 ¦ (101101->101001,k=3) ¦ x & ~ (1 < < (k-1))
右数第k位取反 ¦ (101001->101101,k=3) ¦ x ^ (1 < < (k-1))
取末三位 ¦ (1101101->101) ¦ x & 7
取末k位 ¦ (1101101->1101,k=5) ¦ x & ((1 < < k)-1)

取右数第k位 ¦ (1101101->1,k=4) ¦ x >> (k-1) & 1

把末k位变成1 ¦ (101001->101111,k=4) ¦ x ¦ (1 < < k-1)
末k位取反 ¦ (101001->100110,k=4) ¦ x ^ (1 < < k-1)
把右边连续的1变成0 ¦ (100101111->100100000) ¦ x & (x+1)
把右起第一个0变成1 ¦ (100101111->100111111) ¦ x ¦ (x+1)
把右边连续的0变成1 ¦ (11011000->11011111) ¦ x ¦ (x-1)
取右边连续的1 ¦ (100101111->1111) ¦ (x ^ (x+1)) >> 1
去掉右起第一个1的左边 ¦ (100101000->1000) ¦ x & (x ^ (x-1))
判断奇数 (x&1)==1
判断偶数 (x&1)==0

例如求从x位(高)到y位(低)间共有多少个1

public static int FindChessNum(int x, int y, ushort k)
  {
  int re = 0;
  for (int i = y; i <= x; i++)
  {
  re += ((k >> (i - 1)) & 1);
  }
  return re;
  }
深度学习暑期科研项目(两个月发EI论文) 对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。 阅读详情

相关推荐

从理论到波形:NE555多谐振荡器设计与示波器实战验证

本文详细介绍了NE555多谐振荡器的设计原理与实战验证方法。从基础理论到电路参数计算,再到面包板搭建与示波器测量,全面解析如何利用NE555芯片实现稳定的方波输出。通过实际案例演示了频率调整、占空比优化等技巧,并提供了常见问题排查指南,帮助电子爱好者快速掌握这一经典电路设计。

weixin_29159613的博客 280

C语言的位运算

位操作有逻辑运算和移位运算,如位与、位或、位取反、按位异或、移位等操作。位运算通常会和底层代码寄存器的操作结合在一起使用,比如想要让寄存器中的任意1位或者任意几位位设置为1,或者设置为0,从而实现对寄存器位的控制。

luobeihai的博客 5419

STM32平台下FreeModbus TCP协议栈集成指南

深入讲解在STM32平台如何移植和配置freemodbus协议栈,实现TCP通信功能。结合嵌入式开发细节,帮助开发者快速掌握freemodbus的应用与调试技巧。

weixin_36001279的博客 1142

位运算

位运算 位运算是将整数或字符转化为2进制,对2进制的每一位进行运算。 由于计算机在进行十进制运算时,都要将十进制转化为二进制再进行计算。那么如果一开始就用二进制计算也就是位运算,那么效率将会比十进制转化为二进制再进行运算要高得多,也就是说,这是一个十进制运算的底层算法,省去了将十进制转化为二进制的时间,以提高效率。 移位 左移 xn;  //这表示将操作数x按二进制向左移动n位,

zealot_splcjz的博客 1157

RK3568驱动XS9922B:AHD/CVBS双模摄像头兼容性实战

在嵌入式视频开发中,摄像头驱动的稳定性与兼容性往往决定项目交付质量。Linux内核的V4L2框架提供了统一的视频采集抽象,从v4l2_subdev子设备到media controller链路,再到用户态视频节点,每一层都需要精确配置。对于RK3568这类边缘计算平台,其MIPI CSI接口和自研ISP配合RKCIF,构成了完整的多路视频接入通路。当需要接入模拟视频解码芯片时,驱动设计就需同时考虑AHD高清协议与CVBS标清信号的模式切换、格式协商以及寄存器配置。XS9922B作为支持双模输入的解码芯片,可与

weixin_34216614的博客 346

通用抓取算法AnyGrasp(Graspnet)——本地部署并测试自定义输入数据

背景:GraspNet在数据采集方面,首先将相机固定到机械臂末端,对同一个场景拍摄256个不同的角度,同时场景中的每个物体都会提前采集好3D模型,之后将其投射到仿真环境中,在仿真环境中,对抓取位姿进行打标签,如此完成数据的采集。在运行官方的测试示例时,使用的是路径下的输入数据,可以分析下。color.png(输入):rgb图像(输出):输出的生成抓取位姿的图像depth.png(输入):和当前rgb图像对应的深度图像(保存格式是单通道uint16)meta.mat。

boss-dog 1327

位操作之指定位值读取与写入

博主是菜逼,欢迎大家指正。指定位的读取:例如:10001010读取第4位的值(从右往左)首先需要一个标志值1;1&lt;&lt;4;变成1000在 将1000逻辑与上100010101000101000001000逻辑与的结果就是00001000 要是这个值等于1&lt;&lt;4 ,即1000 则说明这个值就是1反之就是0 。源码就是int a = 11;int b = 1;b =(b &...

Genebrother 1286

YOLOv11与3D点云检测融合技术深度解析:从2D检测到三维空间投影的完整实现

2D-3D融合目标检测技术研究 本文系统阐述了基于YOLOv11的2D-3D目标检测融合技术,重点分析了YOLOv11在融合系统中的定位优势及其架构设计。研究表明,2D图像与3D点云数据具有显著的互补特性:2D图像提供丰富语义信息,而3D点云则精确描述几何结构。 关键技术要点: YOLOv11通过GSConv平衡卷积和VoVGSCS特征融合模块,在保持实时性的同时提升了检测精度 系统采用模块化设计,包含坐标投影、点云分割、边界框拟合等核心组件 针对点云数据的非均匀分布特性,提出了多尺度特征增强和距离差异化检

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1126

位运算:获取、设置、清除特定的位

最基本的操作包括获取位、设置位和清除位。 获取位可以利用&1:&(0x1 << pos) 设置位可以利用|1: | (0x1 << pos) 清除位可以利用&0: &(~(0x1 << pos)) 判断某位是否相同用^:(A & (0x1 << pos)) ^ (B & (0x1 << pos)) ...

panyong6216的博客 1089

线性代数 --- 置换矩阵 (Permutation matrix)

置换矩阵 - permutation matrix

松下J27录放机 3万+

【学习系列】SAP RAP 20:Unmanaged场景开发示例-调用BAPI、BAPI包装类、BO接口创建标准采购订单

本文介绍了在SAP RAP(Restful ABAP Programming)框架下,通过三种方式实现采购订单创建的方案。首先分析了RAP框架对传统BAPI调用的限制,特别是禁止显式COMMIT语句的要求。随后详细阐述了三种实现方式:1)直接调用传统BAPI(仅支持OP环境);2)使用BAPI包装类(仅支持OP环境);3)调用标准业务对象接口(支持所有环境)。 文章重点说明了在unmanaged场景下的技术实现细节,包括字段控制、缓冲区管理、测试运行与实际调用的分离处理等。针对每种方式都提供了完整的实施步骤

DeveloperMrMeng的博客 598

获取int类型每一位的数值

#include<cstdio> #include<iostream> using namespace std; int main(){ int a; scanf("%d",&a); for(int k=31;k>=0;k--){ cout<<((a>>k)&1)<<" "; } cout<&l...

Object_的博客 2491

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

位运算全面总结,关于位运算看这篇就够了

关于位运算的奇技淫巧,看完这篇你就能灵活使用位运算了。

pursuit的博客 12万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

说一说位运算

位运算是什么?‘&’、 ‘|’ 、‘^’、‘~’这些符号是啥意思?快来看看位运算的基础知识吧,文末链接有进阶,学习更快乐!

Sdom_L的博客 6054

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【优选算法 & 位运算】位运算算法入门详解:位运算小专题

【优选算法 & 位运算】位运算算法入门小专题:判定字符是否唯一丢失的数字;两整数之和;只出现一次的数字Ⅱ;消失的两个数字;

OuO-1 的博客 3147

位运算各种方法总结

位运算1、按位与2、按位或3、按位取反4、按位异或5、按位同或6、左移7、带符号右移8、无符号右移9、python实现各种位运算操作 \quad \quad现代计算机中,几乎都是二进制计算机(三进制计算机仅有少量),所有的数据都以二进制的形式存储在设备中。位运算就是直接对整数在内存中的二进制位进行操作。 \quad \quad需要注意,位运算是针对 二进制 的运算,对每一个位进行布尔运算操作。所以 手动 进行 位运算计算 时,需要将数转换成二进制的表示形式,再进行计算。 1、按位与 \quad \quad只

weixin_45666566的博客 7960

位运算的总结

这里我们运用集合与集合的思想,n ,k为两个不同的集合,如果可以使 n 修改为 k,我们是从 n 中去掉元素使其等于 k,那么 k 应该为 n 的子集。要删除最小的元素即为删除最右边的 1。这个题目和之前的类似,只是多了一个可以增加元素的操作,所以仍然是按位异或得到集合 s,这个集合包含 state 中独有的 (需要删除的元素) 和 goal 中独有的 (需要添加的元素)这里是要取两个集合的交集,我们可以用 set 来去重,把两个数组中的元素均存入 set 中,然后减去 set 的大小即为重复元素的数量。

a140781的博客 1714

位运算(1)_常见位运算总结

新的算法专栏出炉--位运算,位运算(1)_常见位运算总结,感兴趣的宝子们千万不要错过哦!!! 下篇让初步掌握位运算的五道题

wer24_25的博客 1784

位运算及其应用

1.位运算优势以及优先级2.位运算和逻辑运算符的对比3.位运算的应用(获取最后一位,快速取模,交换两数,幂运算等等)

zsgmer的博客 2724

位运算算法

于是我们可以像下面这样,一个比特位代表一个字母,这样子我们只要26个比特位就能表示出所有的小写字母,我们让0代表该字母没出现过,1代表该字符出现过。然后,当我们对这个取反后的数加1时,会从最低位(最右侧)开始,遇到第一个0时停止进位,并将这个0及其之后的所有位都设置为1,而之前的所有位都保持不变(但由于是取反后的数,所以它们实际上是原数中对应位置的相反值)。假设我们有一个数 n = 29,并且我们想知道它的二进制表示中的第 x = 3 位(从右向左,从0开始编号)是0还是1。位(从0开始计数)修改成1。

2301_80224556的博客 2029

简记位运算

《位运算小结》   位运算的重要程度从各种课本上就能感受到,毕竟计算机只认识二进制,在工作当中位运算也是能够提高效率的利器。比如汉明距离就用到了异或运算以及查找位1的个数相关的位运算,如果不了解这些而单纯使用循环的话,那效率就大打折扣了。 Key Words:位运算、与、或、异或、取反、位移运算 Beijing, 2020 作者:RaySue Code: Agile Pioneer   位运算   计算机内存中都是以二进制形式存储的。位运算就是直接对整数在内存中的二进制位进行操作。由.

雄关漫道真如铁 而今迈步从头越 4521

编程基础:位运算01,位运算引言

编程基础:位运算

2401_82825368的博客 1411

详解位运算

位运算是基于整数的二进制表示进行的运算。由于计算机内部就是以二进制来存储数据,位运算是相当快的。它直接对整数的二进制位进行操作。位运算符作用于位,并根据每一位是0还是1来产生结果。基本的位运算共 6 种,分别为按位与(AND)、按位或 (OR)、按位异或 (XOR)、按位取反(NOT)、左移和右移。

weixin_73964795的博客 2115
上一篇: 关于二叉树问题
下一篇: C语言创建一个二叉树
EncodedStar
博客等级 码龄10年 2614粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值