запутался, что делает этот кодЧто делает эта строка кода?
for (L=0; L < levels; L++, N_half>>=1){
func(y, N_half);
} // end: levels for loop
В частности, это «N_half >> = 1»
Благодаря
запутался, что делает этот кодЧто делает эта строка кода?
for (L=0; L < levels; L++, N_half>>=1){
func(y, N_half);
} // end: levels for loop
В частности, это «N_half >> = 1»
Благодаря
Он продвигается цикл путем деления N_half на два на каждой итерации. Это эквивалентно:
for (L=0; L<levels; ++L, N_half=N_half/2) {
...
}
Спасибо, большое спасибо – 2009-07-02 11:55:01
N_half>>=1
выполняет 1-место побитового сдвига-вправо на N_half, который (для неотрицательных чисел) делит его на 2.
>>=
должен >>
, как это +=
+
.
Если N_half является положительным или беззнаковым целым числом, оно уменьшает его.
На самом деле, он также работает, если N_half отрицательный. –
RaphaelSP - нет стандарта, указывающего на то, что должна быть использована двоеточечная нотация. Это гарантировано только для неподписанных и позитивных чисел, AFAIK. –
Это право переходит N_half на 1 (т.е. делит его на два) и сохраняет результат обратно в N_half
Это кажется таким же, как
for (L=0; L < levels; L++)
{
func(y, N_Half);
N_Half /= 2;
}
вопрос был перефразировать, так как я ответил он, таким образом, что это уже не действует, но добавил для полноты: Если ничего не будет сделано в течение цикла, это эквивалентно:
N_Half >>= levels;
Предостережения:
Вам нужно снова взглянуть на исходный код - он не назвал «пол», а функция, которую он назвал, заняла y в качестве дополнительного аргумента. –
Кроме того, поведение сдвига вправо на отрицательные (следовательно, обязательно, подписанные) значения не гарантируется, чтобы преобразовать значение в положительное.Стандарт C явно оставляет его до реализации, и сдвиг может скопировать знаковый бит или вставить нули; оба являются правильными (хотя данный компилятор может использовать только один или другой метод). –
И 'floor()' является функцией с плавающей запятой ... –
>> = оператор сдвиги цифры позиции K номера модели на правильных примерах
:
двоичная форма
N = 101010111 // 2-base arithmetic system
N >>= 1; // `division` by 2
N: 010101011
десятичная форма
N = 123456 // 10-base arithmetic system
N >>= 2; // `division` by 10^2
N: 0
, как обычно, , числа в памяти в виде двоичного кода и >> = 1 эквивалентно деления на 2.
??? Как «>> = 2» деление на 100? Ваш пример с десятичным представлением не имеет для меня никакого смысла. Просьба уточнить? – abelenky
Это операция сдвига в десятичной форме. Не бинарный. Вы не можете применить его с помощью «standard» >> =, если у вас нет класса для десятичных чисел. Ex. 345 >> 1 - 345/10, 345 >> 2 - (345/10)/10. –
Ах: перегруженный оператор. Я никогда не сталкивался с такой перегрузкой для >>. Спасибо. – abelenky
Как это связано с битами и битом -shifting? –
Потому что это поведение оператора OP спрашивает. – chaos