位运算(leetcode 190)

左移 <<

右移 >>

1. 左移(<<)
  • 操作:将数的二进制位整体向左移动指定位数,低位补0。
  • 数学效果:相当于原数乘以 2 的 n 次方(n 是移位位数),结果快速变大。
  • 示例 (以 8 位无符号整数为例):
    • 原数:5 的二进制是 00000101
    • 5 << 1 → 00001010 = 10(5 × 2¹ = 10)
    • 5 << 2 → 00010100 = 20(5 × 2² = 20)
    • 5 << 3 → 00101000 = 40(5 × 2³ = 40)
  • 关键点
    • 左移 n 位 = 乘 2^n(无溢出时)。
    • 高位移出后直接丢弃(可能导致溢出)。
    • 常用于快速乘法、位掩码构造(如设置特定位为1)。
2. 右移(>>)

右移分为两种,取决于数的类型(有符号 vs 无符号):

  • 逻辑右移(无符号右移,常用 >>> 在 Java 中)
    • 二进制位整体向右移动,高位补0。
    • 数学效果:相当于除以 2 的 n 次方向下取整。
    • 示例:10 的二进制 00001010
      • 10 >> 1 → 00000101 = 5(10 ÷ 2¹ = 5)
      • 10 >> 2 → 00000010 = 2(10 ÷ 2² = 2)
  • 算术右移(有符号右移,C++/Python 对负数默认)
    • 二进制位向右移动,高位补符号位(负数补1,正数补0),保持符号不变。
    • 示例(负数 -10,二进制补码约 11110110):
      • -10 >> 1 → 11111011 = -5(保持负号,向下取整)
    • 目的:保留负数的正确性。
  • 先写正数 +10 的原码(二进制): 10 的二进制是 00001010(8位,最高位0表示正)。
  • 负数原码(仅符号位变1): -10 的原码:10001010(最高位1表示负)。
  • 求反码(符号位不变,其余位取反): 除最高位,其余位翻转:11110101。
  • 求补码(反码 + 1): 11110101 + 1 = 11110110。

基本概念

  • 它等价于:a <<= b → a = a << b
按位与(&)运算的规则
  • 两个位只有都为 1 时,结果才为 1;否则为 0。

技巧:n & 1 可以提取整数 n 的最低位(1 或 0)

位运算中的"或运算"(|)详解

或运算(Bitwise OR),符号是 (单竖线),是位运算中最常见的运算之一。

1. 基本规则(逐位操作)
  • 两个二进制位进行"或"运算:只要有一个是1,结果就是1;只有两个都是0,结果才是0。
  • 记忆口诀:有1则1,全0才0
相关推荐
遇乐的果园44 分钟前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_1 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
可乐奶茶sky2 小时前
AI Agent 学习
人工智能·学习
茯苓gao2 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
RD_daoyi4 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
chase。4 小时前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人
AOwhisky5 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
前端世界5 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
dear_bi_MyOnly5 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
AOwhisky5 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko