каково значение всех 32 бит, установленных в 1 в int?

Я экспериментировал с битовыми операциями в java

Я попытался установить битовый индекс по индексу, и это то, что у меня есть. Началась установка с 0-го бита в целочисленном от 0 до 31-го бита (так как int имеет максимум 32 бита)

value  of0bits set: 1
value  of1bits set: 3
value  of2bits set: 7
value  of3bits set: 15
value  of4bits set: 31
value  of5bits set: 63
value  of6bits set: 127
value  of7bits set: 255
value  of8bits set: 511
value  of9bits set: 1023
value  of10bits set: 2047
value  of11bits set: 4095
value  of12bits set: 8191
value  of13bits set: 16383
value  of14bits set: 32767
value  of15bits set: 65535
value  of16bits set: 131071
value  of17bits set: 262143
value  of18bits set: 524287
value  of19bits set: 1048575
value  of20bits set: 2097151
value  of21bits set: 4194303
value  of22bits set: 8388607
value  of23bits set: 16777215
value  of24bits set: 33554431
value  of25bits set: 67108863
value  of26bits set: 134217727
value  of27bits set: 268435455
value  of28bits set: 536870911
value  of29bits set: 1073741823
value  of30bits set: 2147483647
value  of31bits set: -1

Ок, отлично! Значение int с битами от 0 до 31-го индекса (от младшего до самого старшего) все установлено, и результат равен -1 - из приведенного выше результата

Позвольте мне попробовать другой способ:

System.out.println(BitVector.countSetBits( -1 ) )  \\ prints '0'

Тогда каково значение всех 32 битов, равных 1 в int?

Добавлена ​​функция countSetBits:

   static int countSetBits(int n)
    {
        int count = 0;
        while (n > 0)
        {
            count += n & 1;
            n >>= 1;
        }
        return count;
    }

person Athul Muralidharan    schedule 16.02.2018    source источник
comment
Как видно из ваших выходных данных, это -1.   -  person tkausl    schedule 16.02.2018
comment
Но почему функция подсчета битов возвращает количество бит, установленное как 0?   -  person Athul Muralidharan    schedule 16.02.2018
comment
Что это BitVector?   -  person shmosel    schedule 16.02.2018
comment
Между прочим, твой счетчик отключился на единицу.   -  person shmosel    schedule 16.02.2018
comment
Что бы ни было BitVector, его реализация countSetBits, скорее всего, неверна.   -  person Lothar    schedule 16.02.2018
comment
@Lothar, или ему передается неправильное значение.   -  person Andy Turner    schedule 16.02.2018
comment
Добавлен код, если countSetBits   -  person Athul Muralidharan    schedule 16.02.2018
comment
Ага, это неверно для половины всех целых чисел: while (n > 0)   -  person shmosel    schedule 16.02.2018
comment
while (n > 0). Думаю, вы сами видите, почему он возвращает 0 для -1   -  person dunni    schedule 16.02.2018
comment
ой. спасибо, позволь мне исправить это и попробовать   -  person Athul Muralidharan    schedule 16.02.2018
comment
@AndyTurner BitVector.countSetBits( -1 ) не похоже, что передано неправильное значение.   -  person Lothar    schedule 16.02.2018
comment
@AthulMuralidharan, почему while (n > 0) может не работать, если вы передадите -1? Отредактировал исправления вашего кода в свой ответ.   -  person Andy Turner    schedule 16.02.2018


Ответы (3)


Вы можете включить все биты с помощью оператора ~:

System.out.println(~0);
System.out.println("Number of bits set to 1: " + Integer.bitCount(~0));

печатает:

-1
Number of bits set to 1: 32

Демонстрация Ideone


Ваш countSetBits не работает по 2 причинам:

  1. while (n > 0) не будет зацикливаться с отрицательным n. Измените его на n != 0.
  2. n >>= 1 - знаковый сдвиг: он сохраняет знаковый бит при сдвиге. Измените его на n >>>= 1.

Демонстрация Ideone

person Andy Turner    schedule 16.02.2018
comment
System.out.println (значение: + BitVector.countSetBits (~ 0)); печатает '0' - person Athul Muralidharan; 16.02.2018

Это значение, как описано здесь на MSDN - Поле UInt32.MaxValue:

Значение этой константы - 4 294 967 295;
то есть шестнадцатеричное 0xFFFFFFFF.

Вы использовали Int32 (подписанный). Следовательно, вы получили -1 по последнему фактору.

Итак, если все биты установлены в 1, integer значение 0xFFFFFFFF будет

  • -1 для подписанных 32-битных integer
  • 4,294,967,295 для беззнаковых 32-битных integer
person zx485    schedule 16.02.2018
comment
Какое будет значение в подписанном int? Когда я вызываю функцию для подсчета бит в -1, она возвращает 0), т.е. установлены нулевые биты. - person Athul Muralidharan; 16.02.2018

Как уже отмечали другие, -1 - правильная интерпретация этого 32-битного целого числа со знаком. Это связано с тем, что это в нотации с дополнением до двух, в которой битовые шаблоны от 0 до 2 ^ 31-1 (включительно) являются положительными, а битовые шаблоны от 2 ^ 31 до 2 ^ 32-1 (включительно) обрабатываются как отрицательные. . Эти отрицательные числа на самом деле являются заданным числом плюс 2 ^ 32. Таким образом, число со всеми 32 битами, установленными в 1, эквивалентно -1.

person rwp    schedule 16.02.2018