Javascript逐位左移的终结性问题
Endianness issue with Javascript bitwise shift left
我正在尝试将这个简单的函数从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]
。
我做错了什么?我认为这可能与endianness有关,但我不知道如何始终如一地处理这种问题。
您的错误似乎是假设数组的元素是8位整数,但JavaScript中逐位运算符的结果是32位整数,因此当您进行左移时,最高有效位仍然存在。
我相信通过更改添加一个位掩码:
output[i] = b[i] << 1;
至:
output[i] = (b[i] << 1) & 0xFF;
应该解决您的问题。
http://jsfiddle.net/MTj63/
顺便说一句,我认为fromOctal()
函数实际上应该命名为fromBinary()
。
相关文章:
- Python左移(符号问题)
- 在 JavaScript 中算术左移 30 次
- JavaScript 零位左移和右移等效于 Python 中的
- 具有固定左列的表.由于位置绝对而导致的行高问题
- 带字符串的左移数字
- 当单击 shift + 鼠标左键单击时,Internet Explorer 浏览器问题 ,文本会自动突出显示
- 文本中从左到右褪色的问题
- 从左向右滑动,而不是褪色的safari css问题
- 边界底部的问题在ul浮动左列表,与开框功能
- 移除类添加类问题
- Javascript左移操作符是如何工作的
- 计算顺序规则左移Lsh"在Javascript
- 按位左移和右移计算在javascript
- 我试着把盒子从左移到右,然后再移回来,但它在几个周期后崩溃了
- 如何在js字符串中修复这个从右到左的脚本问题
- Javascript中的左移计数为负
- 在加载/移除复选框到数组上有问题
- 数组的下标是否被移到了正确的位置向左还是向右
- Javascript逐位左移的终结性问题
- 在 Clojure 中实现 JavaScript 的左移运算符