побитовые операции без побитовых операторов - PullRequest
2 голосов
/ 19 сентября 2009

Вот пример, с которым я столкнулся:

private function bitwiseAnd(a:int, b:int):int {
    var result:int = 0;
    var n:int = 1;
    while ((a > 0) && (b > 0)) {
        if (((a % 2) == 1) && ((b % 2) == 1)) {
            result += n;    
        }
        a = a / 2;
        b = b / 2;
        n = n * 2;
    }
    return result;
}

Так что в принципе все, что мне нужно, - это побитовое или побитовое. Нет, и я настроен. Причина в том, что Pixel Bender не поддерживает побитовые операции (необъяснимо), но поддерживает различные математические операции. Также они не поддерживают циклы для Flash, но вышеперечисленное можно просто расширить.

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

1 Ответ

5 голосов
/ 19 сентября 2009

Похоже на базовое упражнение, особенно «ИЛИ» (измените 2 появления «&&» на «||»):

private function bitwiseOr(a:int, b:int):int {
    var result:int = 0;
    var n:int = 1;
    while ((a > 0) || (b > 0)) {
        if (((a % 2) == 1) || ((b % 2) == 1)) {
            result += n;    
        }
        a = a / 2;
        b = b / 2;
        n = n * 2;
    }
    return result;
}

Есть немного больше работы с Not - потому что вы не можете остановить цикл раньше и вам нужно знать, сколько битов нужно обработать. Последняя проблема заключается в том, как бороться со знаковым битом; это тоже нужно перевернуть. В идеале мы использовали бы целые числа без знака - я не уверен, являются ли они опцией. Этот код позволяет избежать проблем: он переворачивает 31 бит, оставляя 32 бит в качестве упражнения для читателя.

private function bitwiseNot(a:int):int {
    var result:int = 0;
    var n:int = 1;
    var i:int = 0;
    while (i < 31)  {
        if ((a % 2) == 0) {
            result += n;    
        }
        a = a / 2;
        n = n * 2;
        i++;
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...