Каково значение всех 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 причинам:
while (n > 0)
не будет цикл с отрицательнымn
, Измените это наn != 0
,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