位移 按位与 & 按位或 |

44 阅读1分钟

是不是 满足 8个bit 就要 和0xff 4个bit 只能和0x0f &?

对的 👍 你的理解是完全正确的,而且这是最标准、最安全的写法。

一句话总结:

N 个 bit 的值,就用 ((1 << N) - 1) 来 &


1️⃣ 为什么要 &

因为你从一个 uint16 里右移取字段时,高位可能还残留别的 bit,
& 是为了 只保留你关心的那几位


2️⃣ 常见 bit 掩码对照表

bit 数掩码二进制
1 bit0x010000 0001
2 bit0x030000 0011
3 bit0x070000 0111
4 bit0x0F0000 1111
8 bit0xFF1111 1111
16 bit0xFFFF16 个 1

3️⃣ 对你这个字段的正确写法

亮度幅值(bit15–8,8 bit)

uint8 brightness = (value >> 8) & 0xFF;

✔️ 必须 & 0xFF


律动强度(bit7–4,4 bit)

uint8 rhythm = (value >> 4) & 0x0F;

✔️ 只能 & 0x0F,不能用 0xFF


电视尺寸(低 2 bit)

uint8 tvSize = value & 0x03;

✔️ 2 bit → 0x03


4️⃣ 反过来:组包时也要注意

虽然左移时理论上不会串位,但 最好也先 & 一次,防御式编程 👇

uint16 value =
    ((brightness & 0xFF) << 8) |
    ((rhythm     & 0x0F) << 4) |
    (tvSize      & 0x03);

👉 这样即使上层传了非法值,也不会污染别的 bit


5️⃣ 一个万能公式(记住这个就够了)

mask = (1 << bitCount) - 1;

比如:

  • 8 bit → (1 << 8) - 1 = 0xFF
  • 4 bit → (1 << 4) - 1 = 0x0F
  • 2 bit → (1 << 2) - 1 = 0x03