【发布时间】:2014-04-10 00:46:01
【问题描述】:
我正在尝试将这个简单的函数从 Go 转换为 Javascript:
func ShiftLeft(b []byte) []byte {
l := len(b)
if l == 0 {
panic("shiftLeft requires a non-empty buffer.")
}
output := make([]byte, l)
overflow := byte(0)
for i := int(l - 1); i >= 0; i-- {
output[i] = b[i] << 1
output[i] |= overflow
overflow = (b[i] & 0x80) >> 7
}
return output
}
我的第一次尝试是这样的:
function makeEmpty(size) {
var result = [];
for (var i = 0; i < size; i++) {
result.push(0x00);
}
return result;
}
function shiftLeft (b) {
var len = b.length;
if (len == 0) {
throw 'shiftLeft requires a non-empty buffer';
}
var output = makeEmpty(len);
var overflow = 0;
for (var i = len - 1; i >= 0; i--) {
output[i] = b[i] << 1;
output[i] |= overflow;
overflow = (b[i] & 0x80) >> 7;
}
return output;
}
但是,这不起作用。给定以下测试用例:
function fromOctal(str) {
var bytes = [parseInt(str, 2)];
return bytes;
}
console.log(shiftLeft(fromOctal("10000000"))
Javascript 版本返回[256],但预期结果是“00000000”或[0]。
我在这里做错了什么?我认为这可能与字节序有关,但我不知道如何始终如一地处理此类问题。
【问题讨论】:
标签: javascript go bitwise-operators endianness