【问题标题】:Bit Masking a bit register位掩码位寄存器
【发布时间】:2014-10-04 13:11:15
【问题描述】:

我确定有人问过这个问题,但我无法理解如何对 8 位寄存器进行位掩码。

假设我有一个 8 位寄存器。这些位通过PORTD 设置。我想更改除 2 LSB 之外的所有位。

PORTD |= 0b111011XX;

XX 是我不想更改的 2 LSB。

我该怎么做?

【问题讨论】:

  • "我想改变除 [...] 以外的所有位" -- 高 6 位都应该翻转?这需要 XOR (^) 而不是 OR (|)...

标签: c avr bitmask


【解决方案1】:

如果你想清楚你的意图,你可以将屏蔽部分与你设置的值分开,例如:

PORTD |= 0b11101100 & ~0b00000011

这在任何情况下都会得到优化,但会清楚地说明您正在设置什么以及您希望保持原样。

【讨论】:

    【解决方案2】:

    试试这个:

    PORTD |= 0b11101100; // bitwise-OR-ing with 0 retains the original
    

    如果要翻转高6位,又要保留低2位,需要这样做:

    PORTD ^= 0b11111100; // bitwise-XOR-ing with 1 reverses the bit and with 0 retains
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2018-02-08
      • 2014-11-18
      • 2017-07-15
      • 2020-11-21
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多