您如何阅读和理解此移位代码?

时间:2020-06-30 09:23:21

标签: javascript bit-manipulation

因此,我用JavaScript found编写了一些“位缓冲区”代码,这些代码应该可以帮助我编写一个位缓冲区(仅使用其他语言即可)。

我将代码的关键部分粘贴到了这里(仅适用于LittleEndian):

function LittleEndianView(size) {
  Object.defineProperty(this, 'native', {
    value: new Uint8Array(size)
  })
}

LittleEndianView.prototype.get = function(bits, offset) {
  let available = (this.native.length * 8 - offset)

  if (bits > available) {
    throw new Error('Range error')
  }

  let value = 0
  let i = 0
  // why loop through like this?
  while (i < bits) {
    // remaining bits
    const remaining = bits - i
    const bitOffset = offset & 7
    const currentByte = this.native[offset >> 3]

    const read = Math.min(remaining, 8 - bitOffset)

    const a = 0xFF << read
    mask = ~a
    const b = currentByte >> bitOffset
    readBits = b & mask

    const c = readBits << i

    value = value | c
    offset += read
    i += read
  }

  return value >>> 0
}

LittleEndianView.prototype.set = function(bits, offset) {
  const available = (this.native.length * 8 - offset)

  if (bits > available) {
    throw new Error('Range error')
  }

  let i = 0
  while (i < bits) {
    const remaining = bits - i
    const bitOffset = offset & 7
    const byteOffset = offset >> 3
    const finished = Math.min(remaining, 8 - bitOffset)

    const mask = ~(0xFF << finished)
    const writeBits = value & mask
    const value >>= finished

    const destMask = ~(mask << bitOffset)
    const byte = this.view[byteOffset]

    this.native[byteOffset] = (byte & destMask) | (writeBits << bitOffset)

    offset += finished
    i += finished
  }
}

我想在评论中提供帮助,解释每篇文章的含义。似乎有很多我不知道的操纵技巧。例如,如果我在Google上搜索“向右移”或“向左移”,那么我会得到明显的答案,即向右移或向左移。但是为什么用那个数字在那里做位移?他们为什么拒绝这个数字?他们为什么&或|这个数字?

我试图逐行浏览此代码并将其注释掉,但是我正在努力编写注释,因为我不知道为什么他们这样做时会应用位移位操作。

所以我的主要问题是,如何阅读此移位代码并知道为什么执行移位?我将要阅读md5以及其他更复杂的哈希算法和图像处理算法以及其他“位”算法的工作方式,但是首先我想我需要知道何时应用位移位运算符,因为仅了解它们的工作原理并没有多大帮助。

作为一个更深层的问题,也许可以在这里回答...如果给您没有注释或变量名的位操作代码,您如何确定它的作用?

旁注,是否有一本书或列出所有常见技巧的东西?我见过this和其他人,但他们都很矮。

0 个答案:

没有答案
相关问题