значение (число) & (-номер)

Каково значение(number) & (-number)? Я искал это, но не смог найти смысл

Я хочу использоватьi & (-i) в течение цикла, как:

for (i = 0; i 
 Aseem Goyal10 окт. 2012 г., 14:13
@ Чарльз Бэйли да
 Skizz10 окт. 2012 г., 14:22
i=0 инициализатор делает цикл бесконечным, так какi&(-i) также 0. Чтоs делает ли содержимое цикла?
 Basile Starynkevitch10 окт. 2012 г., 14:08
Поразрядно и с отрицанием.
 Skizz10 окт. 2012 г., 16:49
@MooingDuck: когдаi=0 как это в коде, который дан,i&(-i) также 0 и поэтому цикл бесконечен при условии, что тело не меняетсяi, Вы'верно, чтоi&(-i) != 0 заi > 0, ноi ноль в вопросе.
 Rowland Shaw10 окт. 2012 г., 14:09
Почему вы хотите использовать его, если вы не знаете, что это значит?
 Aseem Goyal10 окт. 2012 г., 14:13
Я решал вопрос, но не смог этого сделать. Я посмотрел на решение, и это было единственное, что я не мог понять. Мой подход был тайм-аут, поэтому я думаю, что он используется для оптимизации кода
 Mike10 окт. 2012 г., 14:09
Вы хотите использовать это в цикле, но вы нене знаю, что это делает?
 CB Bailey10 окт. 2012 г., 14:10
я надеюсь, чтоi объявляется с беззнаковым типом.
 Mooing Duck10 окт. 2012 г., 16:25
@SKIZZ: я не думаю 'я &(-я)' всегда 0. С двойным комплиментом, 1 &-1 приводит к 1.

Ответы на вопрос(3)

что отрицательные значения используют двас дополнением. затем-number можно рассчитать как(~number)+1, переверните биты и добавьте 1.

Например, еслиnumber = 92, Тогда это будет выглядеть в двоичном виде:

number               0000 0000 0000 0000 0000 0000 0101 1100
~number              1111 1111 1111 1111 1111 1111 1010 0011
(~number) + 1        1111 1111 1111 1111 1111 1111 1010 0100
-number              1111 1111 1111 1111 1111 1111 1010 0100
(number) & (-number) 0000 0000 0000 0000 0000 0000 0000 0100

Из приведенного выше примера видно, что(number) & (-number) дает вам хоть немного.

Вы можете увидеть код запуска онлайн на IDE One:http://ideone.com/WzpxSD

Вот немного кода C:

#include <iostream>
#include <bitset>
#include <stdio.h>
using namespace std;

void printIntBits(int num);
void printExpression(char *text, int value);

int main() {
  int number = 92;

  printExpression("number", number);
  printExpression("~number", ~number);
  printExpression("(~number) + 1", (~number) + 1);
  printExpression("-number", -number);
  printExpression("(number) & (-number)", (number) & (-number));

  return 0;
}

void printExpression(char *text, int value) {
  printf("%-20s", text);
  printIntBits(value);
  printf("\n");
}

void printIntBits(int num) {
    for(int i = 0; i < 8; i++) {
        int mask = (0xF0000000 >> (i * 4));
        int portion = (num & mask) >> ((7 - i) * 4);
      cout << " " << std::bitset<4>(portion);
    }
}
</stdio.h></bitset></iostream>

Также здесь есть версия на C # .NET:https://dotnetfiddle.net/ai7Eq6

Решение Вопроса

i без знака),-i равно .~i+1

i & (~i + 1) хитрость для извлечения младшего установленного битаi

Это работает, потому что на самом деле +1 устанавливает младший бит сброса и сбрасывает все биты ниже этого. Так что единственный бит, который установлен в обоихi а также~i+1 самый низкий установленный бит изi (то есть самый низкий четкий бит в~i). Биты ниже, чем это ясно в~i+1и биты выше, чем это, не равны междуi а также .~i

Использование его в цикле кажется странным, если тело цикла не изменяетсяi, так какi = i & (-i) является идемпотентной операцией: повторение дважды приводит к тому же результату.

[Редактировать: в комментарии в другом месте вы указываете, что код на самом делеi += i & (-i), Так, что это делает для ненулевыхi очистить младшую группу установленных битовiи установите следующий бит сброса выше, например, 101100 -> 110000. Дляi без четкого бита выше самого низкого установленного бита (включаяi = 0), это устанавливаетi до 0. Так что, если бы нет за то чтоi начинается в0каждый цикл будет увеличиватьсяi отпо крайней мере в два раза больше, чем предыдущий цикл, иногда больше, пока в конце концов он не превыситn и ломается или уходит0 и петли навсегда.

Обычно было бы непростительно писать подобный код без комментариев, но в зависимости от предметной области проблемыможет быть это "очевидно» Последовательность значений для цикла.]

 Aseem Goyal10 окт. 2012 г., 16:49
спасибо, сэр. Понял сейчас
 Steve Jessop10 окт. 2012 г., 14:32
@Anirudha: если оно предназначено, чтобы сохранить его положительным, то это неt работает для случая, когда установлен только самый верхний бит. Но в любом случае, спрашивающий говорит в комментарии, чтоi без знака
 Anirudha10 окт. 2012 г., 14:31
кажется, что он собирается изменить значение i в теле циклов .. я думаюi=i&(-i) для того, чтобы держать егоpositive

Я просто хотел бы показать, как это работает. Этот код дает вам самый низкий установленный битзначение s:

int i = 0xFFFFFFFF; //Last byte is 1111(base 2), -1(base 10)
int j = -i;         //-(-1) == 1
int k = i&j;        //   1111(2) = -1(10) 
                    // & 0001(2) =  1(10)
                    // ------------------
                    //   0001(2) = 1(10). So the lowest set bit here is the 1's bit


int i = 0x80;       //Last 2 bytes are 1000 0000(base 2), 128(base 10)
int j = -i;         //-(128) == -128
int k = i&j;        //   ...0000 0000 1000 0000(2) =  128(10) 
                    // & ...1111 1111 1000 0000(2) = -128(10)
                    // ---------------------------
                    //   1000 0000(2) = 128(10). So the lowest set bit here is the 128's bit

int i = 0xFFFFFFC0; //Last 2 bytes are 1100 0000(base 2), -64(base 10)
int j = -i;         //-(-64) == 64
int k = i&j;        //   1100 0000(2) = -64(10) 
                    // & 0100 0000(2) =  64(10)
                    // ------------------
                    //   0100 0000(2) = 64(10). So the lowest set bit here is the 64's bit

Это работает так же для беззнаковых значений, результат всегда является самым низким установленным битомс ценностью.

Учитывая ваш цикл:

for(i=0;i<=n;i=i&(-i))  

Биты не установлены (i=0) так что вы'мы собираемся вернуть 0 для шага приращения этой операции. Так что этот цикл будет продолжаться вечно, еслиn=0 или жеi модифицируется.

 Aseem Goyal10 окт. 2012 г., 15:10
это я + = я & (-i), кто-то отредактировал мой пост и сделал i = i & (-я);
 Mike10 окт. 2012 г., 15:23
@aseem - хорошо, но это не такне имеет значения, еслиi изменяется внутри цикла (возможно, поэтому он был отредактирован).i=0, следовательноi&(-i)=0, такi+=i&(-i) просто собирается добавить 0 в такi=0+0&(-0) и остается 0.
 Aseem Goyal10 окт. 2012 г., 16:43
Ваше объяснение фантастическое. Я понял. Большое спасибо

Ваш ответ на вопрос