Нужно объяснение строки в C [закрыто]

avatar
Hodormad
9 августа 2021 в 00:51
119
2
-3

В настоящее время я работаю над скриптом, который находит и печатает целое число с основанием 10, обозначающее максимальное количество последовательных 's в двоичном представлении '.

Я хотел бы, чтобы кто-нибудь объяснил мне следующую строку:

n = (n & (n<<1));

Я знаю, что n<<1 сдвигает двоичное число n влево, но что касается остального кода?

Источник
Déjà vu
9 августа 2021 в 00:55
0

n<<1 возвращает n, умноженное на 2, затем между этим результатом и n выполняется двоичное И.

Andreas Wenzel
9 августа 2021 в 01:48
0

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

Martin James
9 августа 2021 в 03:47
0

@Hodormad «Это сообщество создано для того, чтобы мы могли учиться друг у друга» не совсем так, нет. Это не сайт, который предоставляет индивидуальное обучение основным принципам, например. побитовая логика и булева алгебра в C. Учебник или сайт учебных пособий — лучший ресурс для изучения таких вещей.

Martin James
9 августа 2021 в 03:54
0

@Breakingnotsobad «этот парень новичок, и синтаксис довольно сложный», тогда это неподходящее место для получения базового обучения. Кроме того, строка представляет собой простое выражение и оператор присваивания, это не «сложно» для профессионального программиста/энтузиаста, а побитовые операции C легко найти. В каждом учебнике для начинающих или на сайте есть эта информация.

Steve Summit
9 августа 2021 в 05:56
0

Одно дело знать, что n & (n<<1) сдвигает n влево на один бит, а затем выполняет побитовое И с самим собой. Другое дело знать, почему кто-то это сделал, или какой полезный результат (если он вообще есть). Это определенно не основной вопрос! (Я, например, не знаю ответа, хотя в ответе @thebesttv, похоже, есть некоторые подсказки.)

Déjà vu
9 августа 2021 в 08:18
0

На заметку читателю: мое имя здесь упомянуто без моих комментариев, которые были удалены (не мной!)

Hodormad
10 августа 2021 в 00:04
0

@Breakingnotsobad Мои комментарии тоже были удалены

Ответы (2)

avatar
Jaysmito Mukherjee
9 августа 2021 в 01:08
1

Итак, давайте разберемся,

Во-первых, (n << 1) совпадает с (n * 2).

Вот живой пример. (Это на JavaScript, но эти операторы везде одинаковы)

function calc() {
  var n = parseInt(document.getElementById("n").value);
  var result = n << 1;
  var originalBin = toBinary(n);
  var resultBin = toBinary(result);
  document.getElementById("r").innerText = `
  Original Number: ${n}
  Binary(Original): ${originalBin}
  Binary(Shifted): ${resultBin}
  `;
}

function toBinary(n) {
  let binary = "";
  if (n < 0) {
    n = n >>> 0;
  }
  while (Math.ceil(n / 2) > 0) {
    binary = n % 2 + binary;
    n = Math.floor(n / 2);
  }
  return binary;
}
<input id="n" type="number">
<br>
<button onclick="calc()">Calculate</button>
<br>
<b id="r"></b>

Теперь вторая часть оператора &.

Цитата из https://docs.microsoft.com/en-us/cpp/cpp/bitwise-and-operator-amp?view=msvc-160

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

Оба операнда побитового оператора И должны иметь целые типы. Обычные арифметические преобразования, описанные в разделе Стандартные преобразования, применяются к операндам.

avatar
thebesttv
9 августа 2021 в 01:10
1

Я думаю, вы пытаетесь сказать "максимальное количество последовательных 1 в двоичном представлении n? Попробуйте пример (if <821777671 длиной один байт):

       n =   1110 1011
  n << 1 = 1 1101 0110
n&(n<<1) =   1100 0010

Двоичное представление n имеет форму 111 (2 последовательных единицы), 11 (1 последовательная 1) и 1 (0 последовательная 1). n << 1 сдвинет самый левый 1 на девятый бит, который будет отброшен. В результате 3 единицы, что и является ответом.

Затем, если вам нужно подсчитать (в примере 3), вы просто подсчитаете количество единиц в n.