0

我正在运行 Sharepoint 2007 场并尝试计算用户权限。我已阅读有关我从中获取掩码的特定元数据字段的这篇文章。我一直在查看以下指南,以了解我需要比较哪些面具。

这是我的 delima,每当我在 IE javascript 控制台中运行以下代码时,我都会返回 0:

((0x4000000000000000).toString(16) & (0x400001F07FFF1BFF).toString(16))

现在我知道这是不正确的,因为相应的二进制值是:

100000000000000000000000000000000000000000000000000000000000000
100000000000000000000011111000001111111111111110001101111111111

哪个应该等于

100000000000000000000000000000000000000000000000000000000000000

我也将它放入我的 Windows 计算器中,以确保我没有发疯(并获得那些超长的二进制数)。

注意 当我到达这一行时,我意识到我的浏览器是 32 位的(这是我使用它的网站的要求),这是一个 64 位的数字!

如何(最好在一行中)使用 32 位浏览器计算两个 64 位数字的按位与?

我知道我可以将数字转换为二进制字符串并利用循环来检查每一位,但有没有更简单的方法?

编辑 - 解决方案 利用这篇文章中的信息和下面的答案,我想出了以下解决方案:

     var canEdit = false;
var canEditMask = [0x00000000,0x00000004];
var canApprove = false;
var canApproveMask = [0x00000000,0x00000010];
var canRead = false;
var canReadMask = [0x00000000,0x00000001];
var canDesign = false;
var canDesignMask = [0x00000000,0x00000800];
var mask = [originalmask.substring(0,10).toString(16),
                  ("0x"+itemperms.substring(9)).toString(16)];
canEdit = (mask[0] & canEditMask[0]) >0 || (mask[1] & canEditMask[1]) >0;
canRead = (mask[0] & canReadMask[0]) >0 || (mask[1] & canReadMask[1]) >0;
canDesign = (mask[0] & canDesignMask[0]) >0 || (mask[1] & canDesignMask[1]) >0;
canApprove = (mask[0] & canApproveMask[0]) >0 || (mask[1] & canApproveMask[1]) >0;
4

2 回答 2

1

今天晚上我遇到了同样的问题,所以我写了以下内容以允许对 2^32 以上的值进行按位与和或:

    function bitand(val, bit) {
        if (bit > 0xFFFFFFF || val > 0xFFFFFFF) {
            var low = val & 0xFFFFFFF;
            var lowbit = bit & 0xFFFFFFF;
            val /= 0x10000000;
            bit /= 0x10000000;
            return (val & bit) * 0x10000000 + (low & lowbit);
        }
        return (val & bit);
    }

    function bitor(val, bit) {
        if (bit > 0xFFFFFFF || val > 0xFFFFFFF) {
            var low = val & 0xFFFFFFF;
            var lowbit = bit & 0xFFFFFFF;
            val /= 0x10000000;
            bit /= 0x10000000;
            return (val | bit) * 0x10000000 + (low | lowbit);
        }
        return (val | bit);
    }

干杯,杰森

于 2014-04-03T13:23:12.260 回答
0

真正的问题不是您的浏览器,而是语言规范。简而言之.. 逻辑位运算符 &, | etc 都将它们的操作数视为 32 位整数:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

为了进行 64 位宽的操作,您将不得不依赖库或编写自己的函数。

于 2014-01-27T17:07:27.777 回答