Побитовая операция в ActionScript 3 по сравнению с Java

Я изучаю этот код AS3, который записывает BitString в ByteArray. Источник: JPGEncoder#writeBits()

private var byteout:ByteArray;
private var bytenew:int = 0;
private var bytepos:int = 7;

private function writeBits(bs:BitString):void
{
    var value:int = bs.val;
    var posval:int = bs.len-1;
    while (posval >= 0) {
        if (value & uint(1 << posval)) {
            bytenew |= uint(1 << bytepos);
        }
        posval--;
        bytepos--;
        if (bytepos < 0) {
            if (bytenew == 0xFF) {
                writeByte(0xFF);
                writeByte(0);
            } else {
                writeByte(bytenew);
            }
            bytepos=7;
            bytenew=0;
        }
    }
}

Но я не понимаю часть кода.

  • Что такое uint(1 << bytepos)?
  • Что такое условие if (value & uint(1 << posval))?
    • Я не знаю, является ли & битовым оператором «и» или условием «и».
    • Означает ли if (number) в AS3 if (number != 0) ?

Что такое эквивалент кода AS3 в Java?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я считаю, что это операторы битового сдвига AS3. Вы обнаружите, что Java использует тот же синтаксис.

Это связь о битовых операциях в AS3. На странице документации Java здесь объясняется, что делают операторы.

Что касается условия if, оно проверяет, равен ли «posval»-й бит справа в стоимость 1. Он «выбирает» бит, применяя побитовое и между стоимость и сдвигом значения 1 (000...01 в двоичном формате). ) битами посвал.

Ответ принят как подходящий

Побитовые операции в Java несколько неудобны, потому что в Java нет беззнаковых типов. Поэтому, когда вы собираетесь работать с байтами, вы должны убедиться, что вы остаетесь с байтами. Такие вещи, как 0x0f | 0x80 -> 0b1000 1111 сделано с байтами, должно быть все время приведено к байтам:

System.out.printf("%x - %x - (byte)%x - (int)%x\n", 
                   (byte)0x80, 
                   (byte)0xf, 
                   (byte)((byte)0x80|(byte)0xf), 
                    (int)((byte)0x80|(byte)0xf));

OUTPUT:
80 - f - (byte)8f - (int)ffffff8f

Сказав это, вы можете захотеть работать с целыми числами с самого начала и позже привести к байтам.

Код, который вы представляете, транскрибирует BitString в битовый поток, разделенный на байты.

Особый случай обрабатывается, если установлены все биты байта, в этом случае выводится 0xff00.

What is uint(1 << bytepos)?

Это сдвигает левую часть оператора на bytepos бит влево:

1 << 4 -> 0b00010000

What is the if condition if (value & uint(1 << posval))? I don't know whether the & is "and" bit operator, or "and" condition.

& побитовое И, && логическое.

Операция != 0 -> TRUE, если установлен бит в позиции posval. Это условие для установки соответствующего бита в байте.

На самом деле перенос кода на Java должен быть простым. Я бы посоветовал вам использовать простой int в java и преобразовать в байт непосредственно перед тем, как написать:

byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);

Таким образом, вы избегаете постоянного приведения к байтам и избегаете упомянутой выше проблемы с отрицательными байтами.

В Java нет unsigedint, поэтому нужно ли применять приведение типов uint()? Или просто делать все в обычном int, а затем писать байт с помощью (byte)(intbyte & (byte)0xff)?

nhoxbypass 24.06.2019 11:52

код использует только нижние 8 бит, просто игнорируйте uint и просто используйте java int и, как сказано, используйте writeByte() с явно преобразованным байтом.

thst 24.06.2019 11:52

Итак, условие if в Java — это if ((value & (1 << posval)) != 0)?

nhoxbypass 24.06.2019 11:59

Да, так и будет.

thst 24.06.2019 12:18

uint() предотвращает ошибку времени выполнения в AS3. Вы можете увидеть пример в: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/‌​…

pixeloverflow 24.06.2019 18:58

Другие вопросы по теме