如何使用bitwise将4位二进制数转换为8位二进制数?

How to use bitwise to convert a 4-bit binary number to an 8-bit binary number?


我的目标是编写一个按位表达式,用左列中的 4 位数字表示右列中的 8 位数字。 希望有人能帮我解决这个问题。 非常感谢!

4 位 8 位
0001 00000011
0010 00001100
0011 00001111
0100 00110000
0101 00110011
0110 00111100
0111 00111111
1000 11000000
1001 11000011
1010 11001100
1011 11001111
1100 11110000
1101 11110011
1110 11111100
1111 11111111

直接的方法是从一个4位的字dcba开始,通过将每一位移位到正确的位置来首先生成0d0c0b0a

t = (x & 0b0001) | ((x & 0b0010) << 1) | ((x & 0b0100) << 2) | ((x & 0b1000) << 3)

然后复制位:

return t | (t << 1)

需要更少指令的更棘手的替代方法是首先引入一个间隙,使 ac 留在正确的位置:

t = (x | (x << 2)) & 0b00110011

然后移动bd并引入重复:

return ((t + (t | 0b1010101)) ^ 0b1010101) & 0b11111111

(如果数据类型限制为 8 位,则不需要最后的 &)。

如果您创建类型并实现 MutableCollectionRandomAccessCollection 所需的内容,那么您可以使用 Sequence's reduce.

0b1001.afterMitosis // 0b11_00_00_11
extension FixedWidthInteger where Self: _ExpressibleByBuiltinIntegerLiteral {
  var afterMitosis: Self {
    bits.enumerated().prefix(4).reduce(0) {
      let clonedBitPair = .element | .element << 1
      return [=11=] | clonedBitPair << (.offset * 2)
    }
  }
}
public extension FixedWidthInteger where Self: _ExpressibleByBuiltinIntegerLiteral {
  var bits: Bits<Self> {
    get { .init(integer: self) }
    set { self = newValue.integer }
  }
}

/// The bits of an integer, from least significant to most.
public struct Bits<Integer: FixedWidthInteger & _ExpressibleByBuiltinIntegerLiteral> {
  public var integer: Integer
}

// MARK: - MutableCollection, RandomAccessCollection
extension Bits: MutableCollection, RandomAccessCollection {
  public typealias Index = Int

  public var startIndex: Index { 0 }
  public var endIndex: Index { Integer.bitWidth }

  public subscript(index: Index) -> Integer {
    get { integer >> index & 1 }
    set {
      integer &= ~(1 << index)
      integer |= (newValue & 1) << index
    }
  }
}