Что такое (x & 1) и (x ›› = 1)?

Я пытаюсь выполнить присваивание: «Найти количество бит в целочисленном беззнаковом типе данных без использования функции sizeof ()».

Моя цель - преобразовать целое число в биты, а затем их подсчитать. Например: 10 is 1010 и 5 is 101

Преобразование целого числа в битовое представление показывает примерно следующее:

do
{ 
    Vec.push_back( x & 1 ) 
} 
while ( x >>= 1 );

Я не хочу просто копировать вставку. Когда я использую F-10, я вижу, что делает (x & 1), но не знаю, его имя или как он выполняет свою работу (сравнить что-то?). Также я знаю >=, что "больше или равно", но что такое x >>= 1?

Примечание: отмеченный дубликат - это JavaScript, а не C ++.


person Sandra K    schedule 12.08.2016    source источник
comment
Этот вопрос свидетельствует об исследовательских усилиях; Это полезно и понятно Тогда что с грубыми комментариями? и отрицательными ?!   -  person Khalil Khalaf    schedule 12.08.2016
comment
Я не понимаю всех отрицательных голосов. &, >>= и других операторов, как известно, сложно искать в Интернете. Вопрос прост для тех, кто видел этих операторов раньше, но они не говорят сами за себя и могут быть довольно сложными, когда вы видите их впервые.   -  person Sergey Kalinichenko    schedule 12.08.2016
comment
Хорошее название. Очень четкий вопрос. Достаточно легко справиться с учебником, но с трудом использовать онлайн-ресурсы. Может быть, не заслуживает одобрения, но определенно не заслуживает того, чтобы бомбардировка торпедами была получена.   -  person user4581301    schedule 12.08.2016
comment
Настоятельно рекомендую получить хорошую книгу, но если это невозможно, можно найти здесь. Здесь можно найти отличную техническую документацию, часто с примерами.   -  person user4581301    schedule 12.08.2016
comment
@ user4581301 Спасибо за ссылки, я их все посмотрел :)   -  person Sandra K    schedule 13.08.2016
comment
Возможный дубликат Что означает оператор ›› =   -  person Raymond Chen    schedule 01.01.2017
comment
Предупреждение: хотя ваш подход может делать что-то похожее на то, что действительно хочет ваш инструктор, проблема, как указано, - Найти количество бит в беззнаковом целочисленном типе данных без использования функции sizeof () - заключается в нахождении размера a тип данных, а не значение. Я думаю, вы можете убедиться, что все биты установлены в 1, присвоив значение -1 (которое будет преобразовано в максимально возможное целое число без знака при назначении), а затем подсчитать биты в этом значении.   -  person davmac    schedule 01.01.2017
comment
@RaymondChen: действительно плохая идея учить людей смотреть документацию Javascript, чтобы узнать об операторах C ++.   -  person Ben Voigt    schedule 02.01.2017
comment
Вопрос мне непонятен: заголовок запрашивает количество бит в целом числе, а упоминание sizeof предполагает, что sizeof x * CHAR_BIT даст правильный ответ. Но код в вопросе измеряет только количество значимых битов в конкретном аргументе (то есть не считает нулевые биты перед первым 1-битом). Это разные вещи.   -  person M.M    schedule 03.01.2017
comment
Вместо -1 вам, вероятно, следует использовать ~0U, чтобы установить все биты в 1.   -  person Eljay    schedule 07.03.2018
comment
Возможный дубликат Что такое побитовые операторы?   -  person phuclv    schedule 03.05.2019


Ответы (5)


Это побитовые операторы (справочник).

x & 1 производит значение, которое может быть либо 1, либо 0, в зависимости от младшего бита x: если последний бит равен 1, результатом x & 1 будет 1; в противном случае это 0. Это побитовая операция И.

x >>= 1 означает «установить x на себя со смещением на один бит вправо». Выражение оценивается как новое значение x после сдвига.

Примечание. Значение самого старшего бита после сдвига равно нулю для значений беззнакового типа. Для значений типа со знаком самый старший бит копируется из бита знака значения до сдвига как часть расширения знака, поэтому цикл никогда не завершится, если x является типом со знаком, а начальный значение отрицательное.

person Sergey Kalinichenko    schedule 12.08.2016
comment
Привет и спасибо. Не могли бы вы объяснить подробнее (в зависимости от последнего бита) и (сдвинут на единицу вправо)? - person Sandra K; 12.08.2016
comment
x >>= 1 выражение означает: 1) сдвинуть значение x на 1 бит вправо, 2) присвоить новое значение x и 3) вернуть новое значение x как значение выражения. Без 3 это while условие было бы бессмысленным. - person Maxim Egorushkin; 12.08.2016
comment
@MaximEgorushkin Это справедливый момент - составное присваивание используется как выражение, а не как оператор, поэтому важно знать, каково значение выражения. Спасибо! - person Sergey Kalinichenko; 12.08.2016
comment
@ KenY-N Спасибо за комментарий. Это справедливое наблюдение, потому что создание x подписи и начало его с отрицательного числа приведет к бесконечному циклу. - person Sergey Kalinichenko; 12.08.2016
comment
Nit: x & 1 может не иметь типа int в зависимости от типа x. В частности, если x равно long, то x&1 будет длинным. - person Martin Bonner supports Monica; 12.08.2016
comment
Для значений знакового типа самый старший бит копируется из значения до сдвига, - не обязательно. - person Martin Bonner supports Monica; 12.08.2016

x & 1 эквивалентно x % 2.

x >> 1 эквивалентно x / 2

Итак, эти вещи в основном результат и остаток деления на два.

person rama    schedule 07.03.2018
comment
Это верно для чисел со знаком, только в двойках. Для беззнаковых чисел это верно. - person S.S. Anne; 26.09.2019

В дополнение к ответу «dasblinkenlight» я думаю, что может помочь пример. Я буду использовать только 8 бит для лучшего понимания.

x & 1 производит значение, которое может быть либо 1, либо 0, в зависимости от младшего бита x: если последний бит равен 1, результатом x & 1 будет 1; в противном случае это 0. Это побитовая операция И.

Это потому, что 1 будет представлен в битах как 00000001. Только последний бит установлен в 1. Предположим, что x равно 185, который будет представлен в битах как 10111001. Если вы примените побитовую операцию И к x с 1, результатом будет:

00000001
10111001
--------
00000001

Первые семь бит результата операции будут 0 после операции и не будут нести никакой информации в этом случае (см. Операция логического И). Потому что какими бы ни были первые семь бит операнда x, после операции они будут 0. Но последний бит операнда 1 равен 1, и он покажет, был ли последний бит операнда x 0 или 1. Итак, в этом примере результатом побитовой операции И будет 1, потому что наш последний бит x равен 1. Если бы последним битом было 0, то результат был бы также 0, указывая, что последний бит операнда x равен 0:

00000001
10111000
--------
00000000

x >>= 1 означает «установить x на себя со смещением на один бит вправо». Выражение оценивается как новое значение x после сдвига.

Возьмем пример сверху. Для x >>= 1 это будет:

10111001
--------
01011100

А для сдвига влево x <<= 1 это будет:

10111001
--------
01110010

Обратите внимание на примечание пользователя dasblinkenlight относительно смен.

person stackomatiker    schedule 23.02.2018
comment
Отличное объяснение. Спасибо! Не могли бы вы показать основную реалистичную проблему, которую могли бы решить эти операторы? Кроме примера в OP? Пожалуйста и еще раз спасибо - person Sandra K; 23.02.2018
comment
Например. вы можете использовать оба оператора для изменения битов целого числа. См. Первый пример: Обратные биты целого числа. В первом примере будут использоваться оба оператора. А операторы сдвига очень удобны для умножения и деления на 2: Используйте операторы сдвига для умножения и деления на 2 - person stackomatiker; 23.02.2018

Это похоже на x = (x >> 1).

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 

Он сдвигает двоичное значение x на единицу вправо.

E.g.

int x=3;    // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right:
            // x=1, binary form (001)
person Satyendra Yadav    schedule 01.01.2017

(n & 1) проверит, является ли 'n' нечетным или четным, это похоже на (n% 2).

  1. Если n нечетное (n & 1) вернет true / 1;

  2. В противном случае он вернет false / 0;


«››» в (n ›› = 1) - это побитовый оператор под названием «Сдвиг вправо», этот оператор изменяет значение «n», формула имеет следующий вид:

(n >>= m) => (n = n>>m) => (n = n/2^m)

Прочтите статью GeeksforGeek о побитовых операторах, рекомендуется!

person Subit Nath    schedule 05.07.2020