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

最基于底层的运算符——位运算符

位运算符是直接对二进制位(bit)进行操作的运算符,它们在底层开发、算法优化和特定场景(如位掩码、数据压缩)中非常高效。以下是常见位运算符的详解、使用技巧及注意事项:


一、六大核心位运算符

1. 按位与(&
  • 功能:两位同时为1时结果为1,否则为0。
  • 示例
    int a = 5;    // 二进制 0101
    int b = 3;    // 二进制 0011
    int c = a & b; // 结果 0001(十进制1)
    
  • 典型应用
    • 掩码操作:提取特定位(如检查某位是否为1)。
    • 奇偶判断(num & 1) 结果为1则为奇数,0则为偶数。
2. 按位或(|
  • 功能:两位中至少一个为1时结果为1。
  • 示例
    int a = 5;    // 0101
    int b = 3;    // 0011
    int c = a | b; // 0111(十进制7)
    
  • 典型应用
    • 设置特定位:将某位强制设为1(如权限开启)。
3. 按位异或(^
  • 功能:两位不同时结果为1,否则为0。
  • 示例
    int a = 5;    // 0101
    int b = 3;    // 0011
    int c = a ^ b; // 0110(十进制6)
    
  • 特性
    • 自反性a ^ b ^ b = a(用于交换变量或简单加密)。
    • 无进位加法:可用于算法题中的特定数学操作。
4. 按位取反(~
  • 功能:每一位取反(0变1,1变0)。
  • 示例
    int a = 5;    // 0000 0101(假设8位)
    int b = ~a;   // 1111 1010(补码表示,十进制-6)
    
  • 注意:结果依赖于数据类型(如Java中int为32位,C中可能因编译器不同而异)。
5. 左移(<<
  • 功能:将所有位向左移动,低位补0。
  • 示例
    int a = 5;     // 0101
    int b = a << 2; // 010100(十进制20)
    
  • 数学意义:等价于 a * 2^n(但需注意溢出)。
6. 右移(>>>>>
  • 算术右移(>>
    高位补符号位(正数补0,负数补1)。

    int a = 16;    // 0001 0000
    a >> 2;        // 0000 0100(十进制4)
    int b = -8;    // 1111 1000(补码)
    b >> 1;        // 1111 1100(十进制-4)
    
  • 逻辑右移(>>>,Java等特有)
    高位补0,无论正负。

    int a = -8;    // 1111 1111 ... 1000(32位)
    a >>> 1;       // 0111 1111 ... 1100(正数)
    

二、使用技巧与细节

1. 位运算优先级
  • 运算符优先级~ > <<>> > & > ^ > |
    建议:始终用括号明确优先级,如 (a << 1) & 0xFF
2. 位移操作的陷阱
  • 溢出问题:左移可能导致符号位改变(如1 << 31在32位int中为负数)。
  • 右移符号扩展:算术右移保留符号,逻辑右移不保留(语言相关)。
3. 跨语言差异
  • 逻辑右移:Java有>>>,C/C++中无符号类型右移自动补0。
  • 数据类型长度:不同语言中整型位数可能不同(如Python的int是动态长度)。
4. 高效替代方案
  • 乘除优化:用左移/右移代替*2/2(但编译器可能已自动优化)。
  • 判断奇偶(num & 1)num % 2 更快。
  • 交换变量a ^= b; b ^= a; a ^= b;(无临时变量,但可读性差)。
5. 位掩码与标志位
  • 权限控制:用二进制位表示不同权限(如读=1<<0,写=1<<1)。
    #define READ  0x1 // 0001
    #define WRITE 0x2 // 0010
    int user_permission = READ | WRITE; // 0011
    if (user_permission & READ) { ... } // 检查读权限
    

三、实战场景与心得

1. 算法优化
  • 快速计算2的幂1 << npow(2, n) 高效。
  • 统计二进制中1的个数
    int count = 0;
    while (num != 0) {num &= num - 1; // 清除最低位的1count++;
    }
    
2. 数据压缩
  • 存储多个布尔值:用1个字节存储8个布尔状态。
    unsigned char flags = 0;
    flags |= (1 << 3); // 设置第4位为1
    
3. 加密与校验
  • 简单异或加密
    char data = 'A';
    char key = 0x55;
    char encrypted = data ^ key; // 加密
    char decrypted = encrypted ^ key; // 解密
    
4. 硬件交互
  • 寄存器操作:直接通过位掩码配置硬件寄存器。
    // 设置某芯片的配置寄存器(假设第5位为使能位)
    volatile uint32_t *reg = (uint32_t*)0x40020000;
    *reg |= (1 << 5); // 开启功能
    

四、注意事项

  1. 可读性:避免过度使用位运算,优先保证代码可维护性。
  2. 符号问题:处理有符号数时需注意位移后的符号扩展。
  3. 语言特性:不同语言对位运算的实现可能不同(如Python的无限长整数)。
  4. 性能误区:现代编译器可能自动优化代码,手动优化需测试验证。

总结

位运算符是底层编程的利器,特别适合处理二进制数据、优化性能或与硬件交互。掌握其原理后,可结合具体场景灵活使用,但需在效率和可读性之间做好平衡。

相关文章:

最基于底层的运算符——位运算符

位运算符是直接对二进制位&#xff08;bit&#xff09;进行操作的运算符&#xff0c;它们在底层开发、算法优化和特定场景&#xff08;如位掩码、数据压缩&#xff09;中非常高效。以下是常见位运算符的详解、使用技巧及注意事项&#xff1a; 一、六大核心位运算符 1. 按位与&…...

代码随想录算法训练营第三十二天 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

509. 斐波那契数 力扣题目链接(opens new window) 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n -…...

3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

C++ 中前置 `++` 与后置 `++` 运算符重载

C 中前置 与后置 运算符重载的设计原理与使用规范 1. 为什么后置 返回对象而不是引用&#xff1f; 原因&#xff1a; 后置 需要返回自增前的旧值&#xff0c;但旧值在运算后已被修改。为了保存旧值&#xff0c;必须在函数内部创建一个临时对象&#xff08;拷贝原对象的状态…...

Scala:case class(通俗易懂版)

1. case class 是什么&#xff1f; 想象你要做一个表格&#xff0c;比如学生信息表&#xff0c;每一行需要填&#xff1a;姓名、年龄、成绩。 在代码里&#xff0c;这种“表格的一行”就是一个数据对象&#xff0c;case class 就是帮你快速创建这种“表格行”的工具。 普通方…...

Vue、React、原生小程序的写法对比差异

以下是从 变量、方法、路由、状态管理、父子传值 等多个维度对 Vue、React、原生小程序 的对比表格: 技术对比表格 功能/技术Vue (Options/Composition API)React (Hooks)原生微信小程序变量定义data() { return { count: 0 } }(Options API)const count = ref(0)(Composition…...

【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自编码器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介绍&#xff08;内含扩散模型介绍&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…...

java 初学知识点总结

自己总结着玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//类名用大写字母开头 } 2.输入&#xff1a; (1)Scanner:可读取各种类型&#xff0c;字符串相当于cin>>; Scanner anew Scanner(System.in); Scan…...

Android MVC、MVP、MVVM三种架构的介绍和使用。

写在前面&#xff1a;现在随便出去面试Android APP相关的工作&#xff0c;面试官基本上都会提问APP架构相关的问题&#xff0c;用Java、kotlin写APP的话&#xff0c;其实就三种架构MVC、MVP、MVVM&#xff0c;MVC和MVP高度相似&#xff0c;区别不大&#xff0c;MVVM则不同&…...

AI视频领域的DeepSeek—阿里万相2.1图生视频

让我们一同深入探索万相 2.1 &#xff0c;本文不仅介绍其文生图和文生视频的使用秘籍&#xff0c;还将手把手教你如何利用它实现图生视频。 如下为生成的视频效果&#xff08;我录制的GIF动图&#xff09; 如下为输入的图片 目录 1.阿里巴巴全面开源旗下视频生成模型万相2.1模…...

IDEA 2024.1.7 Java EE 无框架配置servlet

1、创建一个目录&#xff08;文件夹&#xff09;lib来放置我们的库 2、将tomcat目录下的lib文件夹中的servlet-api.jar文件复制到刚创建的lib文件夹下。 3、把刚才复制到lib下的servlet-api.jar添加为库 4、在src下新建一个package&#xff1a;com.demo&#xff0c;然后创…...

STM32---FreeRTOS中断管理试验

一、实验 实验目的&#xff1a;学会使用FreeRTOS的中断管理 创建两个定时器&#xff0c;一个优先级为4&#xff0c;另一个优先级为6&#xff1b;注意&#xff1a;系统所管理的优先级范围 &#xff1a;5~15 现象&#xff1a;两个定时器每1s&#xff0c;打印一段字符串&#x…...

深色系B端系统界面,在何种场景下更加适合?

在数字化办公日益普及的当下&#xff0c;B 端系统已成为企业运营管理不可或缺的工具。B 端系统界面设计的优劣&#xff0c;直接影响着用户体验和工作效率。界面不仅仅是人与系统交互的媒介&#xff0c;更是企业业务流程的可视化呈现。随着设计理念和技术的不断发展&#xff0c;…...

如何使用 Python+Flask+win32print 实现简易网络打印服务1

Python 实现网络打印机&#xff1a;Flask win32print 在工作场景中&#xff0c;我们可能需要一个简单的网页接口&#xff0c;供他人上传文档并自动打印到指定打印机。 本文将演示如何使用 Python Flask win32print 库来实现这一需求。 代码详见&#xff1a;https://github.…...

深度学习DNN实战

导包&#xff1a; import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline import numpy as np import sklearn import pandas as pd import os import sys import time from tqdm.auto import tqdm import torch import torch.nn as nn import torch…...

课程3. 分批训练与数据规范、标准化

课程3. 分批训练与数据规范、标准化 理论神经网络的梯度优化反向传播算法 批量训练网络输入的规范化BatchNorm 验证样本实践加载数据集网络构建训练神经网络 课程计划&#xff1a; 1.理论&#xff1a; 批量训练&#xff1b; 输入数据的规范化&#xff1b; 批量标准化&#xff…...

《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导

尽管《机器学习数学基础》这本书&#xff0c;耗费了比较长的时间和精力&#xff0c;怎奈学识有限&#xff0c;错误难免。因此&#xff0c;除了在专门的网页&#xff08; 勘误和修订 &#xff09;中发布勘误和修订内容之外&#xff0c;对于重大错误&#xff0c;我还会以专题的形…...

linux指令学习--sudo apt-get install vim

1. 命令分解 部分含义sudo以管理员权限运行命令&#xff08;需要输入用户密码&#xff09;。apt-getUbuntu 的包管理工具&#xff0c;用于安装、更新、卸载软件包。installapt-get 的子命令&#xff0c;表示安装软件包。vim要安装的软件包名称&#xff08;Vim 文本编辑器&…...

类和对象—多态—案例2—制作饮品

案例描述&#xff1a; 制作饮品的大致流程为&#xff1a;煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作产品基类&#xff0c;提供子类制作咖啡和茶叶 思路解析&#xff1a; 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类&#xff0c;该类…...

嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)

Ultra-small size gaming console。 超小尺寸游戏机-Pico This embedded product is mainly based on miniaturization, followed by his game functions are also very complete, for all kinds of games can be played, and there will be relevant illustrations in the fo…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...