2009-07-02 6 views
1

запутался, что делает этот кодЧто делает эта строка кода?

for (L=0; L < levels; L++, N_half>>=1){ 
    func(y, N_half); 
} // end: levels for loop 

В частности, это «N_half >> = 1»

Благодаря

+0

Как это связано с битами и битом -shifting? –

+1

Потому что это поведение оператора OP спрашивает. – chaos

ответ

9

Он продвигается цикл путем деления N_half на два на каждой итерации. Это эквивалентно:

for (L=0; L<levels; ++L, N_half=N_half/2) { 
    ... 
} 
+0

Спасибо, большое спасибо – 2009-07-02 11:55:01

5

N_half>>=1 выполняет 1-место побитового сдвига-вправо на N_half, который (для неотрицательных чисел) делит его на 2.

>>= должен >>, как это +=+.

0

Если N_half является положительным или беззнаковым целым числом, оно уменьшает его.

+0

На самом деле, он также работает, если N_half отрицательный. –

+0

RaphaelSP - нет стандарта, указывающего на то, что должна быть использована двоеточечная нотация. Это гарантировано только для неподписанных и позитивных чисел, AFAIK. –

0

Это право переходит N_half на 1 (т.е. делит его на два) и сохраняет результат обратно в N_half

0

Это кажется таким же, как

for (L=0; L < levels; L++) 
{ 
    func(y, N_Half); 
    N_Half /= 2; 
} 

вопрос был перефразировать, так как я ответил он, таким образом, что это уже не действует, но добавил для полноты: Если ничего не будет сделано в течение цикла, это эквивалентно:

N_Half >>= levels; 

Предостережения:

  • если N_Half < 2^уровней (0 в течение нескольких итераций)
  • если N_Half < 0 (первый RightShift будет в зависимости от реализации сделать это положительное число)
+0

Вам нужно снова взглянуть на исходный код - он не назвал «пол», а функция, которую он назвал, заняла y в качестве дополнительного аргумента. –

+0

Кроме того, поведение сдвига вправо на отрицательные (следовательно, обязательно, подписанные) значения не гарантируется, чтобы преобразовать значение в положительное.Стандарт C явно оставляет его до реализации, и сдвиг может скопировать знаковый бит или вставить нули; оба являются правильными (хотя данный компилятор может использовать только один или другой метод). –

+0

И 'floor()' является функцией с плавающей запятой ... –

1

>> = оператор сдвиги цифры позиции 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.

+0

??? Как «>> = 2» деление на 100? Ваш пример с десятичным представлением не имеет для меня никакого смысла. Просьба уточнить? – abelenky

+0

Это операция сдвига в десятичной форме. Не бинарный. Вы не можете применить его с помощью «standard» >> =, если у вас нет класса для десятичных чисел. Ex. 345 >> 1 - 345/10, 345 >> 2 - (345/10)/10. –

+0

Ах: перегруженный оператор. Я никогда не сталкивался с такой перегрузкой для >>. Спасибо. – abelenky

Смежные вопросы