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

位运算基础操作总结,包括基础运算符 + 修改某位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.mzph.cn/pingmian/16839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是住宅IP代理?为什么需要家庭 IP 代理

家庭代理 IP 允许您选择特定位置&#xff08;国家、城市或移动运营商&#xff09;并作为代理上网该区域的真实用户。住宅代理 IP 可以定义为保护用户免受一般网络流量影响的中介。它们在隐藏您的 IP 地址的同时充当缓冲区。住宅代理 IP 是服务提供商分配给用户的替代 IP 地址。…

EasyCode生成的SQL语句中无逗号分隔

EasyCode生成的SQL语句中无逗号分隔 EasyCode是一款非常好用的插件&#xff0c;可以帮助我们生成相关的一些代码&#xff0c;但是在生成SQL对应的xml文件之后&#xff0c;发现语句中多个字段之间没有逗号分隔&#xff0c;而是直接连在了一起。接下来&#xff0c;让我们一起去解…

【传知代码】私人订制词云图-论文复现

文章目录 概述原理介绍核心逻辑1、选取需要解析的txt文档2、选取背景图明确形状3、配置停用词4、创建分词词典&#xff0c;主要解决新的网络热词、专有名词等不识别问题 技巧1、中文乱码问题&#xff0c;使用的时候指定使用的文字字体2、更换背景图3、词库下载以及格式转换方式…

多线程编程(12)之HashMap1.8源码分析

之前已经分析过了一版1.7版本的HashMap&#xff0c;这里主要是来分析一下1.8HashMap源码。 一、HashMap数据结构 HashMap 是一个利用散列表&#xff08;哈希表&#xff09;原理来存储元素的集合&#xff0c;是根据Key value而直接进行访问的数 据结构。 在 JDK1.7 中&#xff…

内网穿透端口映射内外网反弹 shell 回顾

内网穿透&端口映射&内外网反弹 shell 回顾 内网概念 我们常说的内网&#xff0c;一般指的是非公有 IPv4 地址的网络比如学校机房里的电脑一般为私有网络&#xff0c;家里的网络也是私有网络 私有网络的范围与划分 ipaddressareaA 类地址10.0.0.0&#xff5e;10.255.…

521源码-免费下载-WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版

更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 本工具下载地址&#xff1a;WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版 - 521源码 WP-AutoPostPro是一款出类拔萃的WordPress自动采集发布插件&#xff0c;凭借其卓…

Yolov5保姆及入门-含源码【推荐】

前言 YOLO系列模型作为一种实时目标检测算法&#xff0c;自从YOLO1发布以来&#xff0c;就以其检测速度快、准确率高而受到广泛关注。随着技术的迭代&#xff0c;YOLO系列已经发展到了YOLO8。本文将详细介绍YOLO5的技术规格、应用场景、特点以及性能对比。 yolov5源码下载地址…

海外真实机房给云手机上“福利”

不论是做出海跨境方面的业务&#xff0c;大家都不自觉的把目光放在了海外的云手机上&#xff0c;尤其是有直播群控&#xff0c;引流获客这样的一个刚需&#xff0c;只有处在海外真实环境了&#xff0c;那么在一些活动的过程中&#xff0c;才能表现的更稳&#xff0c;而不会触发…

Android --- 交换两个布局

准备布局 exchange_out_layout exchange_in_layout <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"andr…

免费,Python蓝桥杯等级考试真题--第13级(含答案解析和代码)

Python蓝桥杯等级考试真题–第13级 一、 选择题 答案&#xff1a;C 解析&#xff1a;正向下标由0开始&#xff0c;下标3代表第四个元素&#xff0c;故答案为C。 答案&#xff1a;A 解析&#xff1a;range&#xff08;0,4&#xff09;的取前不取后&#xff0c;元组的符号是小括…

【CGAL】Region_Growing 检测平面并保存

目录 说明一、算法原理二、代码展示三、结果展示 说明 本篇博客主要介绍CGAL库中使用Region_Growing算法检测平面的算法原理、代码以及最后展示结果。其中&#xff0c;代码部分在CGAL官方库中提供了例子。我在其中做了一些修改&#xff0c;使其可以读取PLY类型的点云文件&…

【搭建大语言模型】使用LocalGPT搭建本地大语言模型服务并实现远程访问进行交互

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问&#xff0c;由于localGPT只能通过本地局域网IP地址端口号的形式访问&#xff0c;实现远程访问…

设计模式15——享元模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 享元模式&#xff08;Flyweigh…

Linux信号:信号的概念及意义

目录 一、什么是信号 kill-l查看信号 二、信号的产生 2.1系统调用 kill raise abort 2.2软件条件 13)SIGPIPE pipe信号 14&#xff09;SIGAKARM alarm信号 2.2硬件中断 2.3异常 8)SIGFPE 除0异常 11)SIGSEGV 野指针 2.4信号处理的常见方式 三、Core Dump和term…

一文详解SaaS增长模式:PLG、MLG、SLG哪种更适合你?

在SaaS&#xff08;软件即服务&#xff09;的领域中&#xff0c;增长策略的选择对于企业的成功至关重要。其中&#xff0c;PLG&#xff08;产品驱动增长&#xff09;、MLG&#xff08;市场驱动增长&#xff09;和SLG&#xff08;销售驱动增长&#xff09;是三种常见的策略&…

Centos 7 安装刻录至服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

强悍!轻量级 Viedo Download 项目!!【送源码】

今天给大家分享一个非常轻量实用的命令行视频下载项目&#xff1a;Lux。 项目简介 Lux是一款基于Golang编写的快速、简单的视频下载库和命令行工具&#xff0c;支持众多个流行的视频网站&#xff0c;包括 YouTube、Bilibili、优酷、爱奇艺、腾讯视频、抖音快手等。 界面简洁易…

重生之 SpringBoot3 入门保姆级学习(07、整合 Redis 案例)

重生之 SpringBoot3 入门保姆级学习&#xff08;07、整合 Redis 案例&#xff09; 导入 Maven 依赖并刷新 Maven <dependencies><!--springboot3 Web 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

高效至臻,Media Encoder 2024 for Mac——您的专业媒体处理首选

Media Encoder 2024 for Mac是一款专为Mac用户打造的专业视频和音频编码工具&#xff0c;凭借其卓越的编码能力和智能编辑功能&#xff0c;为用户提供了前所未有的媒体处理体验。无论是高清、4K还是8K的视频文件&#xff0c;Media Encoder 2024都能轻松驾驭&#xff0c;确保在压…

学习javascript的函数

1.什么是函数&#xff1f; 可以重复被使用的代码块 作用&#xff1a;函数可以把具有相同或者相似逻辑的代码“包裹起来”&#xff0c;有利于代码的复用。 2.函数的基本使用 1.定义函数 利用关键字Function 定义函数&#xff08;声明函数&#xff09; function 函数名(){函…