lelouch_vi 2 Ответов: 3

Я не могу понять смысл этого n &= n - 1;


Здравствуйте, я сейчас изучаю java и столкнулся с этим
n &= n - 1;
- Я не знаю, что все это значит. Я только что видел это на so.

Что я уже пробовал:

Я думаю, что это упрощенная версия, но я просто не знаю, как сделать ее снова сложной.

3 Ответов

Рейтинг:
24

OriginalGriff

Все это время <operator>= операции те же самые:

a op= b;
расширяется до
a = a op b;

Так
a += 2;
Это добавление 2 к a
a *= 2;
умножает a около 2
Таким образом, ваш код является упрощенной версией этого:
n = n & (n - 1);

То, что он делает, - это выполнение двоичного (или побитового) и между ними n и n - 1
Почему у вас есть код, делающий это, можно только догадываться!


lelouch_vi 2

привет, Оригиналгрифф, теперь я все понял. Кристально чистый. У меня есть предчувствие, что это составная версия n &= n - 1. я просто хочу подтвердить, чтобы не впадать в ошибку. Большое спасибо!

OriginalGriff

Всегда пожалуйста!

OriginalGriff

Если вы считаете один бит, вы можете найти это интересным:

https://www.codeproject.com/Tips/365002/A-Csharp-implementation-of-AI-MEMO-239-Item-169-Co

Почитайте сами!

Рейтинг:
18

Sandeep Mewara

- Продолжаю отвечать ОГ. Под побитовым и операционным подразумевается здесь:

uint a = 0b_1111_1000;
uint b = 0b_1001_1101;
uint c = a & b;
Console.WriteLine(Convert.ToString(c, toBase: 2));
// Output:
// 10011000

Цитата:
Для операндов bool оператор & вычисляет логическое и его операндов.
Унарный оператор & - это оператор адреса

Ссылаться:
Побитовые операторы и операторы сдвига - Справочник по C# | Microsoft Docs[^]
Побитовые операторы в Java - GeeksforGeeks[^]

Чтобы объяснить это дальше:
Цитата:
Выход побитового и равен 1, если соответствующие биты двух операндов равны 1. Если один из битов операнда равен 0, то результат соответствующего бита вычисляется равным 0.


Предположим побитовую операцию и двух целых чисел 12 и 25.
12 = 00001100 (In Binary)
25 = 00011001 (In Binary)

Bit Operation of 12 and 25
  00001100
  00011001
  ========
  00001000  = 8 (In decimal)

Через код:
{
    int a = 12, b = 25, c;
    c = a&b;
    Console.Writeline("Output = "+c); // prints Output = 8
}


Таким образом, в целом ваш n &= n-1 переводится в: n = n & n-1
In it, value of n=5 is getting reset to:
n = number(bit(5) & bit(4))
=> n = number((0101) & (0100))
       0101
       0100
      ======
       0100

=> n = number ( 0100 ) = 4

Надеюсь, это прояснит ситуацию.


lelouch_vi 2

Ух ты, спасибо тебе за это. Да, я действительно решаю задачу, где мне нужно посчитать те, что находятся в двоичном коде, скажем, 5-это 0101, ответ должен быть 2. забавно, что я могу написать функцию, чтобы получить входное число и использовать

Integer.bitcount(n)
метод упрощения вещей. Я просто знал о методе после того, как закончил задачу.

Sandeep Mewara

Добро пожаловать! :)