首页 > 编程语言 >【算法】位运算——常见位运算基础操作总结

【算法】位运算——常见位运算基础操作总结

时间:2024-05-31 19:58:08浏览次数:24  
标签:总结 运算 int ret 运算符 二进制 算法 按位 右侧

位运算基础操作总结,包括基础运算符 + 修改某位bit位

目录

1.基础位运算符

基础位运算符有6个,即<<,>>,~,&,|,^

  • << 左移
  • >> 右移
  • ~ 按位取反:全部bit位按位取反(0->1,1->0),包括符号位
  • & 按位与:有0为0
  • | 按位或:有1为1
  • ^ 按位异或:异为1,同为0 或 (无进位相加)

2.按位基础操作

按位基础操作总计有6点,下面依次进行叙述。

1.给一个数 n,确定其二进制的第 x 位是 0/1

公式:ret = (n >> x) & 1
原理:利用与运算,任何数与1进行按位与都是其数本身,任何数与0按位与都是0
图解:
在这里插入图片描述
代码示例:

//1.给一个数 n,确定其二进制的第 x 位是 0/1
void test1()
{
	int n = 106;// 0 1 1 0 1 0 1 0
	int x = 0;

	for (int i = 0; i < 8; i++)
	{
		x = i;
		int ret = (n >> x) & 1;
		printf("n的第%d位(从右往左数)是%d\n", x, ret);
	}
}

效果展示:
在这里插入图片描述

2.将一个数 n 的二进制标识的第 x 位修改成 1

公式:ret = n | (1 << x)
原理:利用或运算,0或上任何数都是原数,1或上任何数都为1
图解:
在这里插入图片描述
代码示例:

//2.将一个数 n 的二进制标识的第 x 位修改成 1
void test2()
{
	int n = 106;// 0 1 1 0 1 0 1 0
	int x = 0;

	for (int i = 0; i < 8; i++)
	{
		x = i;
		int ret = n | (1 << x);
		printf("将n的第%d位修改为1是%d\n", x, ret);
	}
}

效果展示:
在这里插入图片描述

3.将一个数 n 的二进制标识的第 x 位修改成 0

公式:ret = n & ~(1 << x)
原理:利用与运算,任何数与1进行按位与都是其数本身,任何数与0按位与都是0
图解:
在这里插入图片描述
代码示例:

//3.将一个数 n 的二进制标识的第 x 位修改成 0
void test3()
{
	int n = 106;// 0 1 1 0 1 0 1 0
	int x = 0;

	for (int i = 0; i < 8; i++)
	{
		x = i;
		int ret = n & (~(1 << x));
		printf("将n的第%d位修改为0是%d\n", x, ret);
	}
}

效果展示:
在这里插入图片描述

4.提取一个数 n 二进制中最右侧的 1 (除了最右侧的1,即其他位都置为0)

公式:n & (-n)
原理:先利用 -n全部取反且+1,此时-n与n的相同二进制位为最右侧的1及其右边的二进制位(但是只有最右侧的1是1,最右侧的右侧二进制都是0)。再利用按位与不同为0,同1为1。
图解:
在这里插入图片描述
代码示例:

//4.提取一个数 n 二进制中最右侧的 1(除了最右侧的1,即其他位都置为0)
void test4()
{
	int n = 106;// 0 1 1 0 1 0 1 0

	int ret = n & (-n);
	printf("提取最右侧二进制位后的数值为:%d\n", ret);
}

效果展示:
在这里插入图片描述

5.干掉一个数 n 二进制标识中最右侧的 1

公式:ret = n & (n-1)
原理:n-1与n的区别在于最右侧的1因为被“借位”不见了,其最右1的右边均不同(总之有0),此时再利用按位与的同为原数,不同为0的特点即可。
图解:
在这里插入图片描述

代码示例:

//5.干掉一个数 n 二进制标识中最右侧的 1
void test5()
{
	int n = 106;// 0 1 1 0 1 0 1 0

	int ret = n & (n - 1);
	printf("将n的最右侧二进制位1修改为0是:%d\n", ret);
}

效果展示:
在这里插入图片描述

6.按位异或^的运算律

我们知道:对于按位异或而言,异为1,同为0
那也就是说,1 ^ 0 = 1 ; 0 ^ 0 = 0 ; 1 ^ 1 = 1;
我们将这个规律推广到数的层级(8个比特位),该规律依旧存在于数的层级上。
即:
1.num ^ 0 = num ;
2.num ^ num = 0;
3.a ^ b ^c = a ^ c ^ b;

3.相关思想及运算符优先级问题

位图思想

与哈希表相类似,只不过里面存的值变成了单个bite位,这个并不在这里进行详细解释。

优先级

运算符优先级不一样,可能会导致符号运算顺序不满足我们预期。
解决:不确定就加括号

当然,我下面也提供了符号优先级表格,可以了解一下常用的几个:

在这里插入图片描述


EOF

标签:总结,运算,int,ret,运算符,二进制,算法,按位,右侧
From: https://blog.csdn.net/2302_79031646/article/details/139241892

相关文章

  • 【备战蓝桥杯】蓝桥杯省一笔记:算法模板笔记(Java)
    蓝桥杯0、快读快写模板1、回文判定2、前缀和3、差分4、二分查找5、快速幂6、判断素数7、gcd&lcm8、进制转换9、位运算10、字符串常用API11、n的所有质因子12、n的质因子个数13、n的约数个数14、n阶乘的约数个数15、n的约数和16、阶乘&双阶乘17、自定义升序降序18、动态......
  • 代码随想录算法训练营day10(栈与队列)
    代码随想录算法训练营day10(栈与队列):学习内容:std::queue和std::stack是C++标准库中提供的队列和栈的容器适配器,它们分别基于队列和栈的概念,提供了一组简单的操作接口。std::queuestd::queue是一个先进先出(FIFO)的队列容器适配器。它提供了队列的基本操作,包括入队(pus......
  • Python实现SMA黏菌优化算法优化XGBoost回归模型(XGBRegressor算法)项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景黏菌优化算法(Slimemouldalgorithm,SMA)由Li等于2020年提出,其灵感来自于黏菌的扩散和觅食行为,属于元启发算法。具有收敛速度快,寻优能力强的特点。主......
  • Python实现SMA黏菌优化算法优化LightGBM回归模型(LGBMRegressor算法)项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景黏菌优化算法(Slimemouldalgorithm,SMA)由Li等于2020年提出,其灵感来自于黏菌的扩散和觅食行为,属于元启发算法。具有收敛速度快,寻优能力强的特点。主......
  • JavaScript语法(四):新加入的**运算符,哪里有些不一样呢?
    上一节我们已经给你介绍了表达式的一些结构,其中关于赋值表达式,我们讲完了它的左边部分,而留下了它右边部分,那么,我们这节课一起来详细讲解。在一些通用的计算机语言设计理论中,能够出现在赋值表达式右边的叫做:右值表达式(RightHandSideExpression),而在JavaScript标准中,规定了在等......
  • 用c#实现哈夫曼压缩算法
    ///<summary>///hash压缩算法///</summary>///<paramname="file"></param>///<paramname="cancellationToken"></param>///<returns></returns>publicasyncTas......
  • 第2讲:static用法总结
    几句话总结static的用法。1、静态变量(1)静态变量统一放在特定内存区域中,在程序的整个生命周期内只有一份,所以函数在使用时共用静态变量的状态。(2)类中的静态变量为类的所有对象共享,而且不能在类内初始化静态变量。原因:每个对象是独立的,如果可以通过对象的方式初始化静态变......
  • JAVA基础_基本运算
    算数运算符操作符说明举例+加法:相加运算符两侧的值inta=10,b=20;(a+b等于30)-减法:左操作数减去右操作数inta=10,b=20;(a-b等于-10)*乘法:相乘操作符两侧的值inta=10,b=20;(a*b等于200)/除法:左操作数除以右操作数inta=10,b=20;(b/a等于2)%取余:左操作数除以右操作数的余数inta=10,......
  • 论文总结:Grasp-Anything: Large-scale Grasp Dataset from Foundation Models
    目录一、论文摘要二、Grasp-Anything数据集A.场景生成B.抓取姿势标注​编辑C.Grasp-Anything统计D.Grasp-Anything对社区的帮助三、实验A.零样本抓取检测B.机器人评估C.野外抓取检测D.讨论四、总结论文:https://arxiv.org/pdf/2309.09818v1代码:https://......
  • 山东大学项目实训-基于LLM的中文法律文书生成系统- 中期总结
    本次创新项目实训自三月开始,在今天中期检查之后对项目工作进行了回顾,下文对这段工作作简要总结。项目选题其实我是比较犹豫,因为LLM此前的了解只有ChatGPT这种基本成熟的模型,而且也只是简单调用,对源码,接口的使用基本是未知,以我对其他成员的了解,基本也大差不差。因此项目前景堪忧。......