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

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

前端开发10大框架深度解析

摘要 在现代前端开发中&#xff0c;框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南&#xff0c;涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了&#xff0c;mybatis 的基本用法&#xff0c;动态SQL&#xff0c;学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中&#xff0c;对数据库的操作&#xff0c;常常涉及多张表。 因此本篇博客的目标&#xff1a;通过my…...

深度解码!清华大学第六弹《AIGC发展研究3.0版》

在Grok3与GPT-4.5相继发布之际&#xff0c;《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经&#xff0c;不仅预测了2025年AI技术爆发点&#xff0c;更将「天人合一」的东方智慧融入AI伦理建构&#xff0c;堪称数字时代的《道德经》。 文档&#xff1a;清华大学第…...

/dev/console文件详解

/dev/console概览 /dev/console 是 Linux 系统中的一个特殊设备文件&#xff0c;通常用于与系统的控制台进行交互。它的作用和特点如下&#xff1a; 1. 作用 init 进程&#xff08;PID 1&#xff09;和某些系统服务在启动时会使用 /dev/console 进行日志输出&#xff0c;以确…...

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…...

springboot3 WebClient

1 介绍 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端&#xff0c;因此存在一定性能瓶颈。根据 Spring 官…...

牛客周赛 Round 83

A.和猫猫一起起舞&#xff01; 思路&#xff1a;遇到‘U’和‘D’&#xff0c;输出‘R’或者‘L’&#xff1b;遇到‘R’和‘L’&#xff0c;输出‘U’或者‘D’.(这题比较简单) AC代码&#xff1a; void solve() {int n, m, k;char ch;cin >> ch;if (ch U || ch D)…...

硬通货用Deekseek做一个Vue.js组件开发的教程

安装 Node.js 与 Vue CLI‌ npm install -g vue/cli vue create my-vue-project cd my-vue-project npm run serve 通过 Vue CLI 可快速生成项目骨架&#xff0c;默认配置适合新手快速上手 目录结构‌ src/ ├── components/ # 存放组件文件 │ └── …...

Windows权限维持之利用安全描述符隐藏服务后门进行权限维持(八)

我们先打开cs的服务端 然后我们打开客户端 我们点击连接 然后弹出这个界面 然后我们新建一个监听器 然后我们生成一个beacon 然后把这个复制到目标主机 然后我们双击 运行 然后cs这边就上线了 然后我们把进程结束掉 然后我们再把他删除掉 然后我们创建服务 将后门程序注册…...