当前位置: 首页 > article >正文

位运算及其算法

计算机中的所有数在内存中都是以二进制形式进行存储的 ,位运算就是直接对整数二进制位进行操作,有些时候在程序中使用位运算进行操作,会得到极高的便利性。

有符号整数与无符号整数

我们以int整型为例,每个int占4个字节32个bit位。对于无符号整数,这32位的0、1都可以用来表示数字。而对于有符号整数,其最高位的bit位代表着整数的正负,0为正,1为负。因此有符号整型只有前31位可以用来表示数字,范围自然就小很多。

无符号整数可表示的范围(32位):0~2的32次方-1(4,294,967,295)

有符号整数可表示的范围(32位):-2的31次方~2的31次方-1(-2147483648~2147483647)

而我们的位运算,就是通过操作这些bit位来改变数字进而达到想要的效果。接下来我们来介绍一下位运算符号

&(按位与):相同的bit位均为1才为1,否则均为0,比如0101&1100=0100

|(按位或):只要有1就是1,只有均为0才是0,比如0101|1100=1101

^(按位异或):相同为0,不同为1(无进位相加),比如0101^1100=0110

~(按位取反) :把所有位的0变成1,1变成0,比如^(0101)=1010

<<(左移):把所有bit位向左移动k位,高位丢弃,低位补0,比如011001<<2=100100

>>(右移):把所有bit位向右移动k位,若无符号数字,高位补0,有符号数字,高位补1.

(对于正数高位都补0,负数高位都补1)

(十进制)负数的二进制存储(补码)

首先我们要找到其正数的二进制表示(给出-5我们先找到5的二进制表示)然后把正数的二进制取反+1即可。此时得到的是补码,换成原码就是把补码-1再取反。(符号位不变)

正数变成负数(a->-a):把正数的二进制按位取反+1。

负数变成正数(-a->a):把负数的二进制(补码)按位取反再+1。

注,以上经过位运算后得到的都是补码,需要我们转换才能变成原码。 

二进制的运算

在进行二进制的运算时,会有原码和补码的概念,而计算机在计算时都是使用补码运算,存储数据时也是用补码保存的。正数的补码是其二进制本身,负数的补码是其原码二进制按位取反+1(符号位不变)。我们平常用二进制表示的数字都是原码,运算时才用补码。

对于负数的位运算,它们的操作都是建立在补码上,得到的运算结果是补码,最后将补码结果转化成一个普通的十进制数(先补码转换成原码然后换成十进制)结果。

(用位运算符进行操作的对象也是补码)

关于按位取反的运算转换成十进制的过程(补码)

如果是正数,首先所有位按位取反,得到一个负数的二进制(补码),然后把该二进制的符号位不变,其他再按位取反再+1即可得到该负数的原码。如果是负数,先将负数用二进制表示然后按位取反得到补码后再转换成原码。

以上这些知识我们来总结一下就是:我们只需要知道,运算的时候都是拿补码进行位运算,负数的原码是如何转换成补码的,负数的二进制补码如何转换,负数的二进制如何表示成十进制整数。用二进制表示整数都是用原码表示。

关于位运算符的优先级

这里建议直接用括号

关于位运算的一些基础操作

首先,我们要把32位编号,从低到高开始从第0位计数,一直到31位。

1.给一个数n确定它的第x位是0还是1

(n>>x)&1==0?0:1

2.将一个数n的第x位改成1

先将1<<x,然后n|=(1<<x)即可

3.第x位改成0

把1<<x,然后按位取反,然后&n,即n&=(~(1<<x))

4.提取一个数中最右侧的1(经过操作后只有该位是1其余全变成0)lowbit

操作:n&(-n)(-n按位取反+1,是补码因此可以运算)

5.除去最右侧的1

n&(n-1)

^的运算律

a^0=a;

a^a=0;

a^b^c=a^(b^c)

相关文章:

位运算及其算法

计算机中的所有数在内存中都是以二进制形式进行存储的 &#xff0c;位运算就是直接对整数二进制位进行操作&#xff0c;有些时候在程序中使用位运算进行操作&#xff0c;会得到极高的便利性。 有符号整数与无符号整数 我们以int整型为例&#xff0c;每个int占4个字节32个bit位…...

flutter getx路由管理、状态管理、路由守卫中间件、永久储存get_storage

一个简单的路由跳转、状态管理 目录 lib/ ├── main.dart ├── routes/index.dart // 路由表 ├── middlewares/auth_middleware.dart // 登录守卫 ├── pages/ │ ├── home_page.dart │ ├── login_page.dart │ └── profile_page.dart └─…...

贪心算法之跳跃游戏问题

问题背景 本文背景是leetcode的一道经典题目&#xff1a;跳跃游戏&#xff0c;描述如下&#xff1a; 给定一个非负整数数组 nums&#xff0c;初始位于数组的第一个位置&#xff08;下标0&#xff09;。数组中的每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后…...

Dockers Compose常用指令介绍

Dockers Compose常用指令 1、常用指令介绍 1.1、version 指令 顶级一级指令&#xff0c;指定 compose 指定文件格式版本 version: "3.8" services: 不同版本支持的功能不同。常用版本有 ‘2’, ‘3’, ‘3.8’ 等。 1.2、services 指令 顶级一级指令&#xff0…...

YOLOv11 性能评估与横向对比

在第二章中&#xff0c;我们深入剖析了 YOLOv11 的核心技术&#xff0c;从骨干网络、颈部网络到头部&#xff0c;再到损失函数、数据增强和训练策略的创新&#xff0c;揭示了其高性能背后的奥秘。然而&#xff0c;理论的强大最终需要通过严谨的实验数据来验证。本章将详细阐述 …...

kafka在线增加分区副本数

1、问题来源 线上有一个物联网项目依赖kafka集群中指定主题消费&#xff0c;前些天kafka集群中的某一台机器出现了故障&#xff0c;导致kafka这个主题的数据一直无法消费&#xff0c;经查发现为了保证消息的顺序性此主题仅设置了一个分区&#xff0c;但是副本也仅有一个&#…...

Unity 如何使用Timeline预览、播放特效

在使用unity制作和拟合动画时&#xff0c;我们常用到Timeline&#xff0c;前后拖动滑轨&#xff0c;预览动画正放倒放非常方便。如果我们想对特效也进行这个操作&#xff0c;可以使用下文的步骤。 至此&#xff0c;恭喜你又解锁了一个新的技巧。如果我的分享对你有帮助&#xf…...

GIM发布新版本了 (附rust CLI制作brew bottle流程)

GIM 发布新版本了&#xff01;现在1.3.0版本可用了 可以通过brew upgrade git-intelligence-message升级。 初次安装需要先执行 brew tap davelet/gim GIM 是一个根据git仓库内文件变更自动生成git提交消息的命令行工具&#xff0c;参考前文《GIM: 根据代码变更自动生成git提交…...

GitHub 趋势日报 (2025年05月21日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1microsoft/WSLLinux的Windows子系统⭐ 1731⭐ 25184C2virattt/ai-hedge-fundA…...

MySQL篇-其他面试题

MySQL事务 问题&#xff1a;事务是什么&#xff1f;ACID问题 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 1、事务…...

iOS 蓝牙开发中的 BT 与 BLE

在 iOS 开发者的语境里&#xff0c;大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范&#xff0c;但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic&#xff08…...

Git的工作区,暂存区,本地仓库

Git 核心概念解析 1. 工作区&#xff08;Working Directory&#xff09; - 日常操作代码的目录&#xff0c;包含项目所有文件和子目录 - 开发者直接编辑和修改文件的位置 - 实际可见的项目文件结构 2. 暂存区&#xff08;Staging Area&#xff09; - 临时保存修改记录的缓冲区…...

鸿蒙Flutter实战:21-混合开发详解-1-概述

引言 在前面的系列文章中&#xff0c;我们从搭建开发环境开始&#xff0c;讲到如何使用、集成第三方插件&#xff0c;如何将现有项目进行鸿蒙化改造&#xff0c;以及上架审核等内容&#xff1b;还以高德地图的 HarmonyOS SDK 的使用为例&#xff0c; 讲解了如何将高德地图集成…...

MySQL错误1419(HY000)解决方案:SUPER权限缺失与二进制日志启用冲突的3种处理方式

一、错误背景与原因分析 错误描述 在执行存储过程、函数或触发器时,MySQL可能抛出以下错误: ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)…...

[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)

[架构之美]从PDMan一键生成数据库设计文档&#xff1a;Word导出全流程详解&#xff08;二十&#xff09; 一、痛点 你是否经历过这些场景&#xff1f; 数据库字段频繁变更&#xff0c;维护文档耗时费力用Excel维护表结构&#xff0c;版本混乱难以追溯手动编写Word文档&#…...

大量程粗糙度轮廓仪适用于哪些材质和表面?

大量程粗糙度轮廓仪是一种能够在广泛的测量范围内对工件表面进行粗糙度分析的精密仪器。它通常采用接触式或非接触式传感器&#xff0c;通过对工件表面的扫描&#xff0c;捕捉表面微观的起伏和波动&#xff0c;从而获取粗糙度数据。该仪器不仅能测量微小的表面细节&#xff0c;…...

linux 查看java的安装路径

一、验证Java安装状态 java -version正常安装会显示版本信息&#xff1a; openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)二、检查环境变量配置 若已配置JAVA_HOME&#…...

C 语言程序终止的艺术:理解 return main 与 exit() 函数

各类资料学习合集下载地址: ​​​​https://pan.quark.cn/s/472bbdfcd014​​ 每个 C 语言程序都有其起点——​​main​​ 函数。同样,每个程序也都有其终点,即程序执行完毕并退出。在 C 语言中,主要有两种方式可以优雅或立即地终止整个程序的执行,并将一个状态码传递给…...

数据实时同步:inotify + rsync 实现数据实时同步

1 数据实时同步 在生产环境中&#xff0c;某些场景下&#xff0c;要将数据或文件进行实时同步&#xff0c;保证数据更新后其它节点能立即获得最新的数据。 数据同步的两种方式 PULL&#xff1a;拉&#xff0c;使用定时任务的方式配合同步命令或脚本等&#xff0c;从指定服务…...

LeetCode 404.左叶子之和的迭代求解:栈结构与父节点定位的深度解析

一、题目解析&#xff1a;左叶子的定义与问题本质 题目描述 LeetCode 404. 左叶子之和要求计算二叉树中所有左叶子节点的值之和。左叶子的定义是&#xff1a;如果一个节点是其父节点的左子节点&#xff0c;并且它本身没有左右子节点&#xff0c;则称为左叶子。 关键要点 左…...

Unity-编辑器扩展

之前我们关于Unity的讨论都是针对于Unity底层的内容或者是代码层面的东西&#xff0c;这一次我们来专门研究Unity可视化的编辑器&#xff0c;在已有的基础上做一些扩展。 基本功能 首先我们来认识三个文件夹&#xff1a; Editor&#xff0c;Gizmos&#xff0c;Editor Defaul…...

【自用-python】生成准心居中exe程序,防止云电脑操作时候鼠标偏移

封装exe&#xff1a;&#xff1a; altf12是终端---我理解的就是最初始python的运行台 看where python&#xff08;Windows的&#xff09;看是在那个路径 再确保之前pip安装了pyinstaller 然后pyinstaller --onefile --noconsole --name 输出exe的文件名称 你的py文件名称.py…...

Lucide:一款精美的开源矢量图标库,前端图标新选择

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、前言&#xff1a;为何选择 Lucide&#xff1f;二、Lucide 是什么&#xff1f;1.…...

在Rocky Linux 8.10上安装Nginx

如果没有配置操作系统安装源&#xff0c;并且不连接网络&#xff0c;先配置安装源。 sudo dnf install nginx sudo systemctl enable nginx sudo systemctl start nginx systemctl status nginx curl http://ip [rootrocky810 work]# sudo dnf install nginx Last metadata …...

Mac如何允许安装任何来源软件?

打开系统偏好设置-安全性与隐私&#xff0c;点击右下角的解锁按钮&#xff0c;选择允许从任何来源。 如果没有这一选项&#xff0c;请到打开终端&#xff0c;输入命令行&#xff1a;sudo spctl --master-disable, 输入命令后回车&#xff0c;输入电脑的开机密码后回车。 返回“…...

YOLO学习笔记 | YOLO11对象检测,实例分割,姿态评估的TensorRT部署c++

以下是YOLOv11在TensorRT上部署的步骤指南,涵盖对象检测、实例分割和姿态评估: 1. 模型导出与转换 1.1 导出ONNX模型 import torch from models.experimental import attempt_loadmodel = attempt_load(yolov11s.pt, fuse=True) model.eval...

2025最新版Visual Studio Code for Mac安装使用指南

2025最新版Visual Studio Code for Mac安装使用指南 Installation and Application Guide to The Latest Version of Visual Studio Code in 2025 By JacksonML 1. 什么是Visual Studio Code&#xff1f; Visual Studio Code&#xff0c;通常被称为 VS Code&#xff0c;是由…...

机器学习第二十三讲:CNN → 用放大镜局部观察图片特征层层传递

机器学习第二十三讲&#xff1a;CNN → 用放大镜局部观察图片特征层层传递 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 CNN详…...

【嵙大o】C++作业合集

​ 参考&#xff1a; C swap&#xff08;交换&#xff09;函数 指针/引用/C自带-CSDN博客 Problem IDTitleCPP指针CPP引用1107 Problem A编写函数&#xff1a;Swap (I) (Append Code)1158 Problem B整型数据的输出格式1163 Problem C时间&#xff1a;24小时制转12小时制1205…...

《算法笔记》11.8小节——动态规划专题->总结 问题 B: 拦截导弹

题目描述 某国为了防御敌国的导弹袭击&#xff0c;开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭&#xff0c;…...