Круговая побитовая операция - as3 - PullRequest
1 голос
/ 02 февраля 2011

Я новичок в концепции побитовых операций, и сегодня возился с некоторыми примерами. Все казалось ясным до тех пор, пока я не попытался создать функцию для выполнения кругового сдвига битов на uint:

    private function rotateLeft(value : uint, shift : int) : uint {
        if ((shift &= 31) == 0)
            return value;
        return (value << shift) | (value >> (32 - shift));
    }

Есть идеи, почему это не работает? Это кажется простым, но я думаю, что упускаю что-то очевидное.

РЕДАКТИРОВАТЬ:

Я тупо пытался сместить значение цвета (например, 0xFF0000) и ожидал чего-то по линии 0x0000FF, когда на самом деле я получал 0xFF000000 (что правильно, из-за длины uint) - старшие байты предназначены для альфа-значения.

1 Ответ

2 голосов
/ 02 февраля 2011

1 - всегда держите свою смену в диапазоне => shift &= 31

2 - используйте беззнаковое смещение вправо (>>>), иначе у вас будет битовый знак, который будет распространяться на ваш номер, например, (0x80000000 >> 16) будет 0xffff8000, а не 0x00008000.

function rotateLeft(value : uint, shift : int) : uint {
 shift &= 31;
 return (value << shift) | (value >>> (32 - shift));
}
...