【发布时间】:2017-01-09 12:48:03
【问题描述】:
在 JavaScript 代码中,一个字节的 8 位代表 8 个布尔“决策”(又名:标志),需要隔离每个给定位以转换为布尔变量。考虑我使用字符串解析的解决方案:
var bitParser = function (_nTestByte, _nBitOrdinal) {
var bits = ("00000000" + _nTestByte.toString(2)).slice(-8); // convert to binary and zero-pad
return bits[_nBitOrdinal] === "1";
};
console.log(bitParser(0b10100101, 2)); // ECMAScript 6+ prefix, returns true
它有效,并显示了所需的结果。但是,我有一个假设,即位移技术将是比字符串操作更快的选择。我倾向于相信这一点,但渴望证明这一点。
问题是,我还没有生成这样一个可以正常工作的函数,更不用说我可以测试的东西了。我创建了以下我认为准确的逻辑计划:
/*
LOGIC PLAN
----------
0) Remember: all bitwise operators return 32 bits even though we are using 8
1) Left shift until the desired bit is the left-most (highest) position;
2) Right shift (zero filling) 31 bits to eliminate all right bits
*/
登录计划的实施如下。由于按位运算符的 32 位性质,我认为在我们到达正在处理的字节之前,必须首先移出整个左侧 3 个字节(24 位)。然后,假设左起第 3 位(字符串序号 2)是所需位,我将再移出 2 位(序号 0 和 1),总共左移 26 位。
这应该产生一个二进制数,其中所需的位一直在左边,后面跟着 31 个不需要的零字节。将这 31 位右移会产生一个具有 31 个(现在)前导零位的二进制文件,其计算结果为所需位的值。但是,当然,如果那是真的,我不会写这个问题,现在我会吗? :-)
// hardcoded, assuming the second "1" (ordinal 2) is the bit to be examined
console.log((0b10100101 << 26) >> 31); // instead of 1, returns -1
我觉得我真的很接近,但错过了一些东西或者太用力地推动 JavaScript (lol)。
【问题讨论】:
-
实际目标是什么?如果您只想进行位测试以将位标志转换为布尔值,那么这比必要的工作要多很多。
-
实际目标是生成一个函数来完成问题第一段中指定的工作。随后将测试这两种方法的性能。如果不清楚,我深表歉意。
标签: javascript