在执行位运算之前,JavaScript会将操作数转换为32位有符号整数。它还使用32位有符号整数进行操作,这意味着结果是一个32位有符号整数。
因为我想要对32位无符号整数进行位运算,所以我想知道是否有一种方法可以使用JavaScript的混淆结果来找到预期的结果。
为了演示我的想法,例如,在C语言中,这是我想要的参考:
unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */
在 JavaScript 中,
var a = 3774191835;
var b = a >> 2;
/* b == -130193866 */
让我们尝试使用不同的操作。在C语言中,
unsigned int a = 1986735448u;
unsigned int b = a << 1;
/* b == 3973470896 */
在JavaScript中, var a = 1986735448;
var b = a << 1;
/* b == -321496400 */
现在JavaScript使用带符号整数作为操作数进行位运算后,得到的结果与我们在C中对无符号整数进行位运算时得到的结果不同。
我知道有可能解决这个问题,但我不确定如何将JavaScript的结果转换为预期的结果。
对结果进行零填充右移可以解决第二种情况,但不能解决第一种情况。
var a = 3774191835;
var b = (a >> 2) >>> 0;
/* b == 4164773430 */
var a = 1986735448;
var b = (a << 1) >>> 0;
/* b == 3973470896 */