Каково значение всех 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;
    }

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

Идео демо


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

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

Идео демо

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

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

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

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

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

  • -1 для подписанного 32-разрядного integer
  • 4,294,967,295 для неподписанных 32-разрядных integer
Другие вопросы по тегам