ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在javascript中使用按位运算符

2019-05-29 18:23:39  阅读:234  来源: 互联网

标签:javascript


我在javascript中创建一个bitmask.它适用于第0位到第14位.当我只将第15位设置为1.它产生整数值“-2147483648”而不是“2147483648”.我可以通过返回第15位的硬编码“2147483648”来做一个特殊情况的黑客攻击,但我想知道正确的方法.

示例代码:

function join_bitmap(hex_lower_word, hex_upper_word)
{
    var lower_word = parseInt(hex_lower_word, 16);
    var upper_word = parseInt(hex_upper_word, 16);
    return (0x00000000ffffffff & ((upper_word<<16) | lower_word));
}

当hex_lower_word为“0x0”且hex_upper_word为“0x8000”而不是2147483648时,上面的代码返回-2147483648

解决方法:

如前面的答案所解释的那样,按位运算符是32位有符号的.因此,如果在你设置第31位的过程中的任何一点,事情就会严重错误.

在你的代码中,表达式

(upper_word<<16) | lower_word)

由于括号而首先被评估,并且由于upper_word具有最高位设置,因此您现在将具有负数(0x80000000 = -2147483648)

解决方案是确保不将1位移到第31位 – 所以你必须在移位之前将高位字的第15位设置为零:

mask15 = 0x7fff;
((upper_word&mask15)<<16|lower_word)

这将照顾“太大的数字变得消极”,但它不会完全解决问题 – 它只会给出错误的答案!要回到正确答案,您需要在答案中设置第31位,如果在upper_word中设置了第15位:

bit15 = 0x8000;
bit31 = 0x80000000;
answer = answer + (upper_word & bit15)?bit31:0; 

然后重写的函数变为:

function join_bitmap(hex_lower_word, hex_upper_word)
    {
        var lower_word = parseInt(hex_lower_word, 16);
        var upper_word = parseInt(hex_upper_word, 16);
        var mask15 = 0x7fff;
        var bit15 = 0x8000;
        var bit31 = 0x80000000;
        return 0xffffffff & (((upper_word&mask15)<<16) | lower_word) + ((upper_word & bit15)?bit31:0);
    }

不仅有一个“硬编码的特殊情况” – 大约有20亿左右.这照顾了所有这些.

标签:javascript
来源: https://codeday.me/bug/20190529/1179738.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有