当前位置: 首页 > 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…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...