математический / шестнадцатеричный вопрос с ++ - PullRequest
3 голосов
/ 25 июня 2011

Извините, если это звучит немного "нубистски", но я не знаю c ++, и я искал некоторый код для шума перлина, пытаясь выяснить это, когда наткнулся на

& 0x7fffffff

и

(n << 13) ^ n;

и я понятия не имею, что это значит. Я знаю, что 0x7fffffff является шестнадцатеричным, но я не знаю, что означает & Любая помощь?

Ответы [ 5 ]

7 голосов
/ 25 июня 2011

Первое выражение является битовой маской.Он в основном очищает верхний бит числа или эквивалентно вычисляет мод числа свыше 2 ^ 31.

Второе выражение - это сдвиг, за которым следует xor.В арифметике это было бы то же самое, что умножить n на 2 ^ 13, а затем перевернуть все биты, общие для сдвинутой версии и самой себя.Его назначение в коде шума Perlin состоит в том, чтобы вычислить процедурный пространственный хэш координат x, y, чтобы их можно было использовать для заполнения генератора шума.

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

4 голосов
/ 25 июня 2011

& - побитовый оператор AND в C ++

Битовый оператор AND (&) сравнивает каждый бит первого операнда с соответствующим битомвторого операнда.Если оба бита равны 1, соответствующий бит результата устанавливается на 1. В противном случае соответствующий бит результата устанавливается на 0.

     11111111 11110000  
   & 00000000 01100011
     _________________
     00000000 01100000

<< - побитовый оператор сдвига влевов C ++

Оператор << сдвигает свой первый операнд влево на число битов, заданных его вторым операндом, заполняя новые 0 битов справа. </p>

    0 1 0 1 0 1 1 0 << 2
    _____________________
    0 1 0 1 0 1 1 0 0 0

^ - это оператор Ex-Or в C ++

Оператор побитового исключения-ИЛИ сравнивает каждый бит своего первого операнда с соответствующим битом еговторой операндЕсли один бит равен 0, а другой бит равен 1, соответствующий бит результата устанавливается на 1. В противном случае соответствующий бит результата устанавливается на 0.

     0 1 0 1 0 1 1 0
   ^ 0 0 1 1 0 0 1 0
   ___________________  
     0 1 1 0 0 1 0 0

Итак, & 0x7fffffff устанавливает бит 3132-разрядное целое число обнуляется и оставляет другие биты со значениями, которые у них были.

(n << 13) ^ n n смещено влево на 13, а результат XORed с n.

0 голосов
/ 25 июня 2011

& 0x7fffffff означает установку бита 31 (предполагаемого) 32-разрядного целого числа в ноль, сохраняя значения битов от 0 до 30; IOW, сделать 32-битное целое число положительным; IOW, возьмите abs val целого числа.

(n << 13) ^ n; означает сдвиг n влево на 13 битов, затем x или это смещенное значение с исходным значением n.

НТН

0 голосов
/ 25 июня 2011

Символы &, << и ^ называются операторами .Существует страница Википедии, в которой перечислены операторы C / C ++ , так что вы можете узнать об именах этих операторов и затем искать в Google дополнительную информацию.

0x7fffffff - это целое число, записанное вшестнадцатеричное (основание 16) обозначение.Префикс 0x означает, что он шестнадцатеричный.

Возможно, n - это имя целочисленной переменной, определенной на несколько строк выше указанной вами строки.

Скобки служат для выражения группвместе, так что в вашем примере они гарантируют, что n сдвигается влево на 13 битов ДО того, как он получит XOR с n.Без скобок порядок операций будет определяться приоритетом оператора (который в вашем примере дает тот же результат).

0 голосов
/ 25 июня 2011

& является побитовым оператором AND. Так что & 0x7fffffff убирает подписанный бит из 32-битного целого числа. Это означает, что он делает самый левый бит int нуля.

А во втором, первое n смещено влево на 13 с использованием оператора <<, который является оператором смещения влево, и результат этого выражения используется в операции XOR с самим n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...