因此,我用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和其他人,但他们都很矮。