Javascript рассчитать логическое И между двумя 64-битными числами в 32-битном браузере?
Я использую ферму Sharepoint 2007 и пытаюсь рассчитать разрешения пользователей. Я прочитал этот пост о конкретном поле метаданных, откуда я получаю свою маску. И я смотрел на следующее руководство, чтобы увидеть, с какими масками мне нужно сравнивать.
Вот моя проблема, когда я запускаю следующий код в консоли JavaScript javascript, я получаю 0:
((0x4000000000000000).toString(16) & (0x400001F07FFF1BFF).toString(16))
Теперь я знаю, что это неверно, потому что соответствующие двоичные значения:
100000000000000000000000000000000000000000000000000000000000000
100000000000000000000011111000001111111111111110001101111111111
Который должен равняться
100000000000000000000000000000000000000000000000000000000000000
Я также поместил это в свой калькулятор Windows, просто чтобы убедиться, что я не сошел с ума (и получить эти супер длинные двоичные числа).
ПРИМЕЧАНИЕ Когда я дошел до этой строки, я понял, что мой браузер 32-битный (что является обязательным требованием для сайта, на котором я его использую), и это 64-битное число!
Как я могу (желательно в одной строке) вычислить побитовое И двух 64-битных чисел, используя 32-битный браузер?
Я знаю, что я мог бы преобразовать число в двоичную строку и использовать цикл для проверки каждого бита, но есть ли более простой метод?
РЕДАКТИРОВАТЬ - Решение Используя информацию из этого поста и ответ ниже, я пришел к следующему решению:
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;
2 ответа
Проблема не в вашем браузере, а в спецификации языка. Короче.. логические побитовые операторы &, | и т. д. все обрабатывают свои операнды как 32-битные целые числа:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
Для выполнения 64-битной операции вам придется полагаться на библиотеку или написать свою собственную функцию.
Сегодня вечером я столкнулся с той же проблемой, поэтому написал следующее, чтобы разрешить побитовое И и ИЛИ значений выше 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);
}
Ура, Джейсон