Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 您如何阅读和理解此位移位代码?_Javascript_Bit Manipulation - Fatal编程技术网

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

Javascript 您如何阅读和理解此位移位代码?,javascript,bit-manipulation,Javascript,Bit Manipulation,所以我用JavaScript编写了一些“位缓冲区”代码,这些代码应该可以帮助我编写位缓冲区(只是我用的是另一种语言) 我将代码的关键部分粘贴到这里(仅限LittleEndian): 功能LittleEndianView(大小){ Object.defineProperty(这是“本机的”{ 值:新Uint8Array(大小) }) } LittleEndianView.prototype.get=函数(位,偏移量){ let available=(this.native.length*8-偏移量

所以我用JavaScript编写了一些“位缓冲区”代码,这些代码应该可以帮助我编写位缓冲区(只是我用的是另一种语言)

我将代码的关键部分粘贴到这里(仅限LittleEndian):

功能LittleEndianView(大小){
Object.defineProperty(这是“本机的”{
值:新Uint8Array(大小)
})
}
LittleEndianView.prototype.get=函数(位,偏移量){
let available=(this.native.length*8-偏移量)
如果(位>可用){
抛出新错误('范围错误')
}
设值=0
设i=0
//为什么要这样循环?
while(i>3]
const read=Math.min(剩余,8位偏移量)
常数a=0xFF>位偏移量
readBits=b&mask
常数c=readBits>>0
}
LittleEndianView.prototype.set=函数(位,偏移){
可用常量=(this.native.length*8-偏移量)
如果(位>可用){
抛出新错误('范围错误')
}
设i=0
while(i>3
const finished=Math.min(剩余,8位偏移量)
常数掩码=~(0xFF>=已完成

const destMask=~(mask and应该可以让你开始了。但是你肯定知道,在SO?上询问参考资料是离题的,要理解“为什么”我建议你自己试着实现这个函数。它记录得很好,所以只考虑如何解决它。数据结构看起来是什么样的?你想从哪里得到什么数据?代码实际上是很可读的。@贝尔吉检查它,进步。受到你的评论的启发。并且应该让你开始。但是Suelle。你知道要求推荐人是离题的吗?为了理解“为什么”我建议你自己尝试实现这个函数。它被记录得很好,所以只考虑如何解决它。数据结构看起来是什么样的?你想从哪里得到什么数据?代码实际上是很可读的。@贝尔吉检查它,进步!受到你的评论的启发。
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
  }
}