ActionScript / Flex: побитовое И / ИЛИ более 32-битное - PullRequest
4 голосов
/ 04 ноября 2008

Вопрос: Существует ли простой способ (библиотечная функция) выполнять побитовое И или ИЛИ для чисел больше 32-битного в ActionScript?

Из документов: «Битовые операторы внутренне манипулируют числами с плавающей запятой, превращая их в 32-разрядные целые числа. Точная выполняемая операция зависит от оператора, но все побитовые операции оценивают каждую двоичную цифру (бит) 32-разрядного целого числа отдельно для вычисления нового значения. . "

Облом ...

Я не могу использовать & или | ops - AS предоставляет библиотечную функцию, чтобы сделать это для Numbers?

Особенности: я портирую кучу java для сгибания, а java поддерживает кучу «длинных» масок. Я знаю, что могу разделить маски Java на две части на стороне flex. Поскольку все мои манипуляции с маской локализованы, это не будет слишком болезненным. Тем не менее, я хотел бы сохранить порт как 1-1, насколько это возможно.

Есть предложения? Спасибо!

Ответы [ 5 ]

1 голос
/ 10 декабря 2009

`

public class NumberUtils
{
  public static const MSB_CONV : Number = Math.pow(2, 32);

  public static function bitwiseAND(num1 : Number, num2 : Number) : Number {
    var msb1 : int = num1 / MSB_CONV;
    var msb2 : int = num2 / MSB_CONV;

    return (msb1 & msb2) * MSB_CONV + (num1 & num2);
  }
..OR..shiftRight..
}

`

1 голос
/ 05 ноября 2008

Если вы не возражаете переносить Javascript, Leemon Baird написал общедоступную библиотеку Javascript для обработки больших целых чисел здесь:

http://www.leemon.com/crypto/BigInt.html

Вы не сможете явно использовать & и | операторы, но вы должны иметь возможность дополнять существующий код методами bitwiseAnd и bitwiseOr.

1 голос
/ 06 ноября 2008

Я думаю, что ваш самый простой вариант - разбить маски и, если возможно, маскируемые данные на две части. Вы сталкиваетесь с пробелом в особенностях, поэтому нет смысла быть хитрым, если вы можете помочь. И если вам не нужна настоящая поддержка BigNum, лучше даже не рассматривать ее.

0 голосов
/ 23 мая 2017
public function readInt64():Number
{
    var highInt:uint = bytes.readUnsignedInt();
    var lowerInt:uint = bytes.readUnsignedInt();
    return highInt * Math.pow(2,32) + lowerInt;
}

public function writeInt64(value:Number):void
{
    this.writeUnsignedInt(int(value / 0xffffffff));
    this.writeUnsignedInt(int(value));
}
0 голосов
/ 05 ноября 2008

Согласно http://livedocs.adobe.com/flex/3/html/help.html?content=03_Language_and_Syntax_11.html, 64-разрядные целые числа (со знаком или без знака) отсутствуют ... только 32-разрядные.

Тип Number, как вы упомянули выше, имеет 53-битную мантиссу, что слишком мало для вас.

Я искал реализацию BigNum FLEX, но не смог ее найти.

Я предполагаю, что вам придется смоделировать это либо с массивом целых, либо с классом с высоким и низким целым числом.

Удачи, Рэнди Стегбауэр

...