Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > lowestOneBit


Автор: priam220 25.8.2011, 17:09
Не совсем понятно 
a) метод возвращает 1, 2 либо число кратное степеням двойки (2, 4, 8).
 Это как то не сочитается с ее описанием:
Код

lowestOneBit
public static int lowestOneBit(int i)
Returns an int value with at most a single one-bit, in the position of the lowest-order ("rightmost") one-bit in the specified int value. Returns zero if the specified value has no one-bits in its two's complement binary representation, that is, if it is equal to zero. 

Returns:
an int value with a single one-bit, in the position of the lowest-order one-bit in the specified value, or zero if the specified value is itself equal to zero.
Since:
1.5


b) как можно еще использоваться этот странный метод (кроме проверки четности, как выяснилось).

Автор: Дрон 25.8.2011, 17:18
priam220, 
Цитата(priam220 @  25.8.2011,  18:09 Найти цитируемый пост)
a) метод возвращает 1, 2 либо число кратное степеням двойки (2, 4, 8).

Это правильно, ведь в описании сказано, что возвращается число либо с одним битом, установленным в 1, либо число 0.
А один включенный бит выглядит в десятичной виде как число кратное степени двойки. Например: 00010000 это 16; 00000010 это 2.

Цитата(priam220 @  25.8.2011,  18:09 Найти цитируемый пост)
как можно еще использоваться этот странный метод (кроме проверки четности, как выяснилось). 

Как хотите smile
Если хочется получить индекс первого включенного бита, а не его значение, то есть метод numberOfTrailingZeros

Добавлено через 2 минуты и 41 секунду
Кстати, не совсем понятно что за "проверка чётности" имеется ввиду.

Автор: priam220 25.8.2011, 17:35
тут была http://forum.vingrad.ru/forum/topic-336842.html, там подкинули такую идею, по поводу проверки четности.

Цитата

in the position of the lowest-order ("rightmost")

так вроде ж не просто бит, а крайне правый бит... А какой крайне правый бит в еденицу у 16?

Плюс метод называется lowestOneBit... Я бы хотел получать значение 0/1 от такого метода, разве не логично?


Как хотите это конечно правильно. Только что б захотеть, надо еще догадаться. smile

Автор: Nofate 25.8.2011, 19:46
Там чистым английским языком написано, что  возвращается число, которое содержит всего один бит, установленный в единицу (остальные биты - нули), соответствующий самому правому биту, установленному в единицу в передаваемом аргументе.

Если бы функция возвращала просто младший бит, назвалась бы lowestBit ) Только его итак легко получить в виде остатка от деления на 2  (т.е. x%2) 

А этой функция очень полезна при всевозможных операциях, связанных с битовыми полями. Например, вы в виде значения типа 01011100 храните набор флагов, каждый флаг соответствует какому-то действию или состоянию, и среди них приоритет имеет самый младший включенный флаг.
- 
Еще таким образом можно определять, делится ли число на 2, 4, 8, 16 и т.д.
-
На четность проще проверять как раз остатком от деления на 2. Но при помощи этой функции можно определить как четные все числа , для которых lowestOneBit(x)  <> 1

Автор: priam220 25.8.2011, 20:14
К сожалению, не у всех так хорошо с чистым английским. Спасибо, понял.
А почему лучше? 

Автор: jk1 26.8.2011, 04:41
Цитата

А почему лучше?


Потому что очевиднее. Вариант с lowestOneBit() эффективнее, но в сколько-нибудь большом проекте читаемость и очевидность кода куда важнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)