2015-09-12 2 views
0

Мне нужно выяснить, является ли int n силой двух, и мой подход состоит в том, чтобы преобразовать n в шестнадцатеричное число и проверить каждый бит (0 или 1). Тем не менее, я никогда не использовал шестнадцатеричные числа на Java, может ли кто-нибудь помочь мне здесь?Преобразование int в hex в Java

+0

Что будет преобразовывать в шестнадцатеричное ** представление ** достичь? –

+0

Я думал, могу ли я преобразовать его в шестнадцатеричное представление, тогда я могу проверить, сколько битов числа равно 1, если только бит равен 1, а остальные бит равны 0, то это сила 2. –

+0

Что делает представление связано со значением? Зачем вам нужен гекс? Почему не десятичный? Почему не восьмеричный? –

ответ

1

Оба преобразования в строку и замена с использованием обычного выражения стоят дорого.

Простым способом проверки (положительной) мощности двух является проверка установленных битов числа.

if (x > 0 && Long.bitCount(x) == 1) 

Хотя Long.bitCount выглядит сложным, виртуальная машина может заменить его одной инструкции машинного кода.

+0

Я попытался сделать это, используя if (Integer.bitCount (n) == 1) return true else return false, но с входом n = -2147483648 это не сработало. –

+0

Знаете ли вы, в чем проблема? –

+0

@JacksonWang как значение без знака '-2147483648' - это сила двух. Вы можете добавить чек для этого. –

0

Нет причин для преобразования в шестнадцатеричный код для проверки битов. На самом деле это на самом деле усложняет работу. Следующая строка производит двоичную строку для Int переменной «NUM»:

String binary = Integer.toString(num, 2) 

Эта строка будет иметь только 1 и 0 в нем. Затем устранить любые 0s:

String ones = binary.replace("0", ""); 

Если длина строки больше, чем один, там более чем один бит, что означает, что он не является степенью 2. Если длина 0, это означает, число не имело битов, а это значит, что оно равно 0.

+0

Отлично! Спасибо за совет, у меня есть чему поучиться. –

+3

Безумно дорогой способ сделать это, но это сработает. –

1

канонический путь (который вы встретите много, когда прибегая к помощи как испытать для степеней двойки, и вы, вероятно, столкнуться с ним в коде) для проверки полномочий двух является

x != 0 && (x & x - 1) == 0 

Часто встречается с более скобкой (старшинство паранойей?)

x != 0 && (x & (x - 1)) == 0 

распространено пропустить x != 0 чек и гарантию ноля не может быть входа, или (достаточно часто) ноль «так же хорошо, как» двойки в каком-то смысле.

Вы можете, конечно, изменить условие x > 0, если вы не хотите, чтобы рассмотреть -2147483648 степень двойки, хотя во многих случаях это будет (потому что это сравнимо с 2 по модулю 2 , истолковано беззнаковое это горшок, и в любом случае он только один бит установлен таким образом это был горшок все вместе)


так что сделка с x & x - 1. Он отключает младший бит, но давайте посмотрим на него в контексте PoT.

Давай игнорировать х < 2 и сказать й имеют вид а10 к (т.е. произвольная строка бит, за которыми следует один следует K нули), вычитание 1 из нее дает a01 к поскольку -1 заимствует через все конечные нули до тех пор, пока он не достигнет младшего бита набора, отключает этот бит, тогда заимствования умирают и верхние биты остаются неизменными.

Если взять побитовое И a10 К и a01 к вы получите А00 к, потому что что-то операция AND с самим собой себя еще раз (a), а в хвосте всегда есть 0 участвует в И так все нули.

Теперь есть два случая. 0) а = 0. Тогда результат равен нулю, и мы знаем, что мы начали с x вида 10 k, который является степенью двух. И 1) a! = 0, тогда результат не равен нулю либо потому, что в нем все еще появляется a, а x не является степенью двух, потому что у него есть как минимум два бита набора (самый младший бит набора, на который мы явно смотрели , и по крайней мере один другой где-то в a).

На самом деле есть еще два случая: x = 0 и x = 1, которые были проигнорированы. Если мы допустим, что k равно нулю, то x = 1 также включено. x = 0 раздражает, хотя в x & x - 1 есть x в качестве левого операнда &, поэтому результат должен быть равен нулю, независимо от того, что происходит в правом операнде. Поэтому он выпадает как особый случай.

+0

Я действительно не понимаю использование '(x & x - 1) == 0', можете ли вы объяснить, что он должен делать? –

+0

@JacksonWang для '&' для возврата '0' значения должны иметь разные биты, установленные на' 1', или все они должны быть '0'. Единственный раз, когда 'x' и' x-1' имеют разные биты, когда 'x' является степенью 2. Если задано более одного бита, вычитание одного из них не изменит их всех. Если установлен только один бит, он будет изменен на ноль. –