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