按位与(Bitwise AND)和按位异或(Bitwise XOR)

按位与(&)

按位与是对两个数的二进制表示的每一位进行逻辑与操作。

规则:两个对应位都为1时,结果位才为1,否则为0。

示例:

5 & 35 的二进制:0101
3 的二进制:0011
-----------
按位与:0001 (即1)

按位异或(^)

按位异或是对两个数的二进制表示的每一位进行逻辑异或操作。

规则:两个对应位不同时,结果位为1,相同时为0。

示例:

5 ^ 35 的二进制:0101
3 的二进制:0011
-----------
按位异或:0110 (即6)

特性

按位与特性:

  • x & 0 = 0
  • x & x = x
  • x & ~x = 0
  • 可用于检查奇偶性:x & 1(结果为1则是奇数,0则是偶数)

按位异或特性:

  • x ^ 0 = x
  • x ^ x = 0
  • x ^ y = y ^ x(交换律)
  • (x ^ y) ^ z = x ^ (y ^ z)(结合律)
  • 可用于交换两个变量的值(不使用临时变量):
    a ^= b;
    b ^= a;
    a ^= b;
    

应用场景

按位与常见用途:

  1. 掩码操作(提取特定位)
  2. 判断奇偶性
  3. 权限系统中检查权限

按位异或常见用途:

  1. 交换两个变量的值
  2. 加密算法
  3. 查找唯一出现一次的数字(其他数字都出现两次)
  4. 图形学中的颜色混合

这两种位操作在底层编程、算法优化和嵌入式系统中经常使用。

完整的按位运算

除了按位与(AND)和按位异或(XOR)外,还有以下几种常见的按位运算:

1. 按位或(Bitwise OR) |

对两个数的二进制表示的每一位进行逻辑或操作。

规则:两个对应位中只要有一个为1,结果位就为1。

示例:

5 | 35 的二进制:0101
3 的二进制:0011
-----------
按位或:0111 (即7)

特性

  • x | 0 = x
  • x | x = x
  • x | ~x = ~0(全1)
  • 常用于设置特定位为1

2. 按位非(Bitwise NOT) ~

对一个数的二进制表示的每一位进行取反操作(一元运算符)。

规则:0变1,1变0。

示例:

~55 的二进制:0101
-----------
按位非:1010 (在4位表示中为-6,具体取决于数据类型长度)

注意:结果取决于数值的位数和表示方式(补码表示法)。

3. 左移(Left Shift) <<

将二进制数向左移动指定位数,右侧补0。

效果:相当于乘以2的n次方(无溢出时)。

示例:

5 << 25 的二进制:0101
左移2位:010100 (即20)

4. 右移(Right Shift) >>

将二进制数向右移动指定位数,左侧补符号位(算术右移)或补0(逻辑右移,取决于语言)。

效果:相当于除以2的n次方(向下取整)。

示例:

5 >> 15 的二进制:0101
右移1位:0010 (即2)

5. 无符号右移(Zero-fill Right Shift) >>>(某些语言如Java、JavaScript)

将二进制数向右移动指定位数,左侧总是补0。

示例:

-5 >>> 1 (在32位系统中)-5 的二进制:11111111111111111111111111111011
无符号右移1位:01111111111111111111111111111101 (一个大正数)

复合赋值运算符

所有位运算符都有对应的复合赋值形式:

  • &= (按位与赋值)
  • |= (按位或赋值)
  • ^= (按位异或赋值)
  • <<= (左移赋值)
  • >>= (右移赋值)
  • >>>= (无符号右移赋值)

应用总结

运算符名称用途示例
&按位与掩码操作、权限检查
l按位或设置特定位
^按位异或交换值、加密、找唯一数
~按位非取反操作
<<左移快速乘以2的幂
>>右移快速除以2的幂(算术右移)
>>>无符号右移处理无符号数的右移(逻辑右移)

这些位运算在底层编程、算法优化、嵌入式系统开发、图形处理和加密算法中都有广泛应用。

Java 实现:查找唯一出现一次的数字(其他数字都出现两次)

方法思路
  1. 异或运算特性

    • 任何数和 0 异或等于它本身:x ^ 0 = x 0 在异或运算中相当于“无影响”
    • 任何数和自身异或等于 0x ^ x = 0
    • 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
  2. 算法步骤

    • 初始化 result = 0
    • 遍历数组,对每个元素执行 result ^= num
    • 最终 result 就是唯一出现一次的数字。
代码实现
public class SingleNumber {public static int singleNumber(int[] nums) {int result = 0; // 初始时 result=0,不影响第一次运算for (int num : nums) {result ^= num;}return result;}public static void main(String[] args) {int[] nums = {4, 1, 2, 1, 2};System.out.println("唯一出现一次的数字是: " + singleNumber(nums)); // 输出: 4}
}
代码解释
  1. 方法 singleNumber

    • 初始化 result0
    • 使用增强 for 循环遍历数组 nums,对每个元素 num 执行异或操作 result ^= num
    • 最终返回 result,即唯一出现一次的数字。
  2. 主方法 main

    • 定义一个测试数组 nums,其中 4 是唯一出现一次的数字。
    • 调用 singleNumber 方法并打印结果。
复杂度分析
  • 时间复杂度O(n),只需遍历数组一次。
  • 空间复杂度O(1),仅使用常数空间存储 result
示例运行

输入:[4, 1, 2, 1, 2]
输出:唯一出现一次的数字是: 4

进阶问题

如果数组中有两个数字只出现一次,其他数字都出现两次,如何找出这两个数字?
提示

  1. 先异或所有数字得到 xorSum
  2. 找到 xorSum 的任意一个为 1 的位(如最低位的 1)。
  3. 根据该位将数组分成两组,分别异或得到两个唯一数字。

Java 实现示例

public static int[] findTwoSingleNumbers(int[] nums) {int xorSum = 0;for (int num : nums) {xorSum ^= num;}int diffBit = xorSum & -xorSum; // 找到最右边的不同位int[] result = new int[2];for (int num : nums) {if ((num & diffBit) == 0) {result[0] ^= num;} else {result[1] ^= num;}}return result;
}

二进制数1

牛客网 : 二进制数1

在这里插入图片描述

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main{public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new InputStreamReader(System.in));long lnum=Long.parseLong(br.readLine());br.close();System.out.println(Long.bitCount(lnum));}
}

二进制不同位数

牛客网 : 二进制不同位数

在这里插入图片描述

import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String s = null;while ((s = reader.readLine()) != null) {String[] cs = s.split(" ");//int n = Integer.parseInt(s);//异或,相同是0,不同是1,先异或,再统计1的个数int a = Integer.parseInt(cs[0]);int b = Integer.parseInt(cs[1]);int c = a ^ b;int res=0;while (c!=0){res+=c&1;c=c>>>1;}System.out.println(res);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87192.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87192.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87192.shtml

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

相关文章

python3GUI--基于PyQt5+SQLite3的网址审核系统(详细图文)

文章目录 一&#xff0e;前言二&#xff0e;相关知识1.PyQt52.sqlite3 三&#xff0e;效果预览1.登录2.注册3.普通用户身份权限4.管理员身份权限 三、技术讨论1.数据展示表格1. 更强的表现力和交互性&#xff08;前端功能丰富&#xff09;2. 数据处理效率更高&#xff08;支持大…

与后端现场联调mock数据

当我们后端在现场没办法连后端本地就可以使用mock数据&#xff0c;模拟后端返回数据。使用工具&#xff1a;apifox 一、安装好以后--新建接口 举个栗子&#xff1a; 我想建个接口http://123.123.123.123:8080/api/login 二、 新建期望&#xff0c;返回固定值&#xff0c;否则…

C# 事件(发布者和订阅者)

发布者和订阅者 很多程序都有一个共同的需求&#xff0c;即当一个特定的程序事件发生时&#xff0c;程序的其他部分可以得到 该事件已经发生的通知。 发布者/订阅者模式&#xff08;publisher/subscriber pattem&#xff09;可以满足这种需求。在这种模式中&#xff0c;发布 …

RediSearch高性能全文搜索引擎

RediSearch 是 RedisLabs 团队开发的一个高性能全文搜索引擎&#xff0c;可作为一个 Redis Module 运行在 Redis 上。 Redis7&#xff1a;百万数据级Redis Search 超越 ElasticSearch Redis Search是基于Redis的全文搜索引擎模块&#xff08;RediSearch&#xff09;&#xff0c…

菜谱大全——字符串处理艺术:从文本解析到高效搜索 [特殊字符][特殊字符]

目录 前言一、现实场景二、技术映射2.1 基础刀工&#xff1a;String类2.2 高效剁馅&#xff1a;StringBuilder2.3 精准雕刻&#xff1a;正则表达式 三、知识点呈现3.1 String vs StringBuilder vs StringBuffer3.2 正则表达式核心语法速查3.3 字符串拼接性能陷阱 四、代码实现五…

webpack+vite前端构建工具 -答疑

webpack答疑 1 输入webpack命令&#xff0c;执行的是全局版本还是本地版本的webpack 当在命令行窗口输入webpack命令时&#xff0c;其执行优先级可通过以下步骤明确判断&#xff1a; 1.1 【全局安装优先机制】 执行原理&#xff1a;系统会按照环境变量PATH的顺序逐级查找可执…

API接口开放平台 Crabc 3.4 发布

Crabc 是一款 API 接口开发平台&#xff0c;企业级接口管理、SQL2API 平台。支持动态数据源、动态 SQL 和标签&#xff0c; 支持接入&#xff08;mysql、oracle、达梦、TiDB、hive、es 和 mongodb&#xff09;等 SQL 或 NoSQL 数据源&#xff0c;在线可视化编写 SQL 快速发布接…

PD快充协议芯片XSP04D支持全协议+支持串口通讯+支持与主板共用一个Type-C

随着Type-C接口的充电器普及&#xff0c;市面上的PD充电器越来越多&#xff0c;小家电产品可不配充电器&#xff0c;使用Type-C接口&#xff0c;然后加入一颗PD协议取电协议芯片XSP08即可让充电器/充电宝/车充等电源输出9V/12V/15V/20V电压给产品供电。 针对各种各样的不同需求…

C# 高效加载txt文件内容

在 C# 中&#xff0c;高效加载 TXT 文件内容可以通过多种方法实现&#xff0c;具体方法的选择取决于文件的大小和读取需求。以下是一些常用的方法&#xff1a; 1. 使用 File.ReadAllText 如果文件比较小&#xff0c;并且你希望一行一行地读取整个内容&#xff0c;可以使用 Fi…

(2)pytest执行用例的规则

1. 简介 今天主要学习一下pytest的执行用例的规则。 2. 通过help帮助查看pytest如何使用 .查看pytest命令行参数&#xff0c;可以用pytest -h 或pytest --help查看 3. 用例设计原则 文件名以test_*.py文件和*_test.py以test_开头的函数以Test开头的类以test_开头的方法所有的…

InnoDB数据页

导读&#xff1a; 我们已经知道了页是数据库存储的基本单位&#xff0c;知道了一条行记录的存储格式是怎样的&#xff0c;当数据越来越多时&#xff0c;那一条条行记录具体又是怎么在页中被组织起来的呢&#xff1f; 一、InnoDB数据页结构 二、总结 1、一条条行数据是如何在数…

世赛背景下,中职物联网应用与服务赛项实训解决方案

一、世赛背景与物联网应用赛项概述 1.1 世赛发展历程及对中职教育的影响 世界技能大赛&#xff08;WorldSkills Competition&#xff0c;简称世赛&#xff09;自1950年创立以来&#xff0c;已经成为全球范围内展示职业技能水平的重要赛事。截至2024年&#xff0c;世赛已成功举…

【攻防篇】解决:阿里云docker 容器中自动启动xmrig挖矿-- 实战

文章目录 场景一、问题二、原因三、解决方案1、控制台处理2、 [清除与防护](https://blog.csdn.net/ladymorgana/article/details/148921668?spm1001.2014.3001.5501)1. 紧急处理&#xff1a;停止挖矿进程2. 清理被感染的容器3. 防护措施&#xff1a;防止再次被入侵4. 排查入侵…

飞算智造JavaAI:智能编程革命——AI重构Java开发新范式

文章目录 引言&#xff1a;当传统Java开发遇上AI一、技术架构解析1.1 核心架构图1.2 关键技术栈 二、实战演示&#xff1a;从需求到代码的全AI辅助2.1 场景&#xff1a;电商优惠券系统开发2.2 代码生成实例2.3 智能调试演示 三、与传统开发模式对比测试3.1 基准测试数据3.2 典型…

[特殊字符] 分享裂变新姿势:用 UniApp + Vue3 玩转小程序页面分享跳转!

在如今流量成本日益攀升的移动互联网时代&#xff0c;"用户分享拉新" 成为了增长的重要策略。而微信小程序作为天然具备社交传播力的平台&#xff0c;提供了较完善的分享机制支持。本文将从实战角度出发&#xff0c;手把手教你如何使用 uni-app Vue3 构建一个支持「…

[创业之路-458]:企业经营层 - 蓝海战略 - 重构价值曲线、整合产业要素、创造新需求

“重构价值曲线、整合产业要素、创造新需求”是蓝海战略中实现价值创新的核心路径&#xff0c;它们构成了一个从内部优化到外部协同&#xff0c;再到市场颠覆的完整逻辑链条。以下从理论框架、实践方法和企业案例三个维度展开分析&#xff1a; 一、重构价值曲线&#xff1a;打…

慢查询引发对mysql索引的探索

目录 一、索引分类 1.1 聚簇索引结构 1.2 非聚簇索引(二级索引) 1.3 主键索引 1.4 唯一索引 1.5 普通索引 1.6 前缀索引 1.7 联合索引 1.8 索引下推 1.9 索引区分度 二、优化索引的方法 2.1 索引的特点 2.2 适合创建索引的情况 2.3 不适合创建索引的情况 2.4 优…

启用不安全的HTTP方法

背景&#xff1a; 今天被安全检测出一个这样的问题&#xff1a;启用不安全的HTTP方法。DELETE方法是用来调试web服务器连接的http方式&#xff0c;支持该方式的服务器文件可能被非法删除&#xff1b;PUT方法用来向服务器提交文件&#xff1b;TRACE方法本用于客户端测试到服务器…

fvcom 水深文件dep制作

fvcom 水深文件dep制作 fvcom 水深文件dep制作20250630 本次案例网格和水深展示 vv image Figure 1 Model domain 本次制作其它驱动文件的输入文件为yellowsea.2dm 格式2dm; 文件内容格式详细介绍参考&#xff1a; https://www.xmswiki.com/wiki/SMS:2D_Mesh_Files_*.2dm …

ViewModel是EventFlow-State映射

ViewModel负责组装界面状态State。引发State变换的原因有很多&#xff0c;比如用户点击某个按钮&#xff0c;一次网络请求受到应答&#xff0c;一次本地数据库查询返回结果等等。因此ViewModel是根据各种事件生成State的对象&#xff0c;换句话说&#xff0c;是一个从多个事件流…