Что означает >>= в C или C ?

#c #c

#c #c

Вопрос:

Что означает >>= символ в C или C ? Есть ли у него какое-либо конкретное имя?

У меня есть этот for цикл в некотором коде CUDA, который выглядит следующим образом

 for(int offset=blockDim.x; offset>0; offset >>=1)
{
   //Some code 
}
  

Как переменная offset модифицируется с помощью >>= оператора?

Ответ №1:

>>= Символ является формой присваивания сдвига вправо, то есть x >>= y; является сокращением от x = x >> y; (если не перегружен, чтобы означать что-то другое).

Сдвиг вправо на 1 эквивалентен делению на 2. Этот код выглядит так, как будто кто-то не доверяет компилятору выполнять самые базовые оптимизации, и должен быть эквивалентен:

 for( int offset = blockDim.x; offset > 0; offset /= 2 ){ ... }
  

Больше информации о побитовых операциях здесь:

http://en.wikipedia.org/wiki/Binary_shift#Bit_shifts

Комментарии:

1. Учитывая, что в этом случае оба операнда имеют тип int, использование перегруженного оператора может быть исключено.

2. Сдвиг вправо на 1 очень похож на деление на 2, но вы можете получить немного другой результат для отрицательного числа из-за правил округления для целочисленного деления. В этом примере нет отрицательных чисел, поэтому здесь это эквивалентно. Но в C и C -3 / 2 == -1, в то время как -3>> 1 = -2.

Ответ №2:

Буквально offset = offset >> 1 , то есть offset делится на 2

Ответ №3:

Это версия назначения сдвига вправо:

 foo >>= 2; // shift the bits of foo right by two places and assign the result to foo
  

Ответ №4:

это оператор побитового сдвига вправо. это сдвигает биты переменной вправо на значение правого операнда.