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

server/2024/9/23 10:23:59/

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

目录

  • 1.基础位运算符
  • 2.按位基础操作
    • 1.给一个数 n,确定其二进制的第 x 位是 0/1
    • 2.将一个数 n 的二进制标识的第 x 位修改成 1
    • 3.将一个数 n 的二进制标识的第 x 位修改成 0
    • 4.提取一个数 n 二进制中最右侧的 1 (除了最右侧的1,即其他位都置为0)
    • 5.干掉一个数 n 二进制标识中最右侧的 1
    • 6.按位异或^的运算律
  • 3.相关思想及运算符优先级问题
    • 位图思想
    • 优先级

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 0int 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 0int 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 0int 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 0int 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 0int 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


http://www.ppmy.cn/server/43408.html

相关文章

HTML静态网页成品作业(HTML+CSS)——川西旅游介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

openLayers加载wms图层并定位到该图层

openLayers定位到wms图层 我们的wms是加载geoserver发布的服务&#xff0c;wms加载的图层是没法通过layer.getSource().getExtent()来获取到extents&#xff08;边界&#xff09;的&#xff1b;实现思路是通过postgis的函数(st_extent(geom))来获取extents; 返回前端后格式化一…

前端基础入门三大核心之HTML篇 —— 深入解析从URL请求到页面加载的艺术

前端基础入门三大核心之HTML篇 —— 深入解析从URL请求到页面加载的艺术 一、起点&#xff1a;URL的奥秘与浏览器的使命1. URL解构2. 浏览器的启动步骤 二、HTML的旅行&#xff1a;请求与接收1. HTTP/HTTPS请求2. 响应与下载 三、构建DOM&#xff1a;HTML的解析与构建1. 解析HT…

羊毛纤维直径检测 — C++

羊毛纤维检测 系统是 Ubuntu20.04 。 需要用到 OpenCV 的库&#xff0c;库具体该怎么编译配置&#xff0c;可以参考网上的教程。 自己码的一小段函数&#xff0c;用纯 CV 的方式处理羊毛纤维图像&#xff0c;如图所示&#xff1a; 在 wool 下面&#xff0c;创建 build 文件…

AWS联网和内容分发之VPC

Amazon Virtual Private Cloud&#xff08;VPC&#xff09;是一项用于在AWS云中创建一个逻辑隔离的虚拟网络的服务&#xff0c;使用户能够在云中启动AWS资源&#xff08;例如EC2实例&#xff09;&#xff0c;并将其放置在自己定义的虚拟网络中。 Amazon VPC让您能够全面地控制…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19.1讲 串口格式化输出printf

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

You don‘t have enough free space或者no space left on device异常

1.磁盘空间不足 Linux安装软件显示 You dont have enough free space 或者docker拉镜像时&#xff0c;出现磁盘空间不足的情况 no space left on device 如果你是ubuntu系统。查看磁盘空间 df -h 多半是这个目录满了/dev/mapper/ubuntu--vg-ubuntu--lv 大多情况我们只希望扩…

系统管理、磁盘分区

系统管理 业务层面&#xff1a;为了满足一定的需求所做的特定操作。 硬盘是什么&#xff0c;硬盘的作用&#xff1a; **硬盘&#xff1a;**计算机的存储设备&#xff0c;机械硬盘是由一个或者多个磁性的盘组成&#xff0c;可以在盘片上进行数据的读写。 连接方式&#xff1a…