2009-07-30 3 views
0

Легко конвертировать десятичную в двоичную и наоборот на любом языке, но мне нужна функция, которая немного сложнее.Десятичный бит (двоичный)

Учитывая десятичное число и двоичное место, мне нужно знать, включен ли бинарный бит или нет (True или False).

Пример:

 
IsBitTrue(30,1) // output is False since 30 = 11110 
IsBitTrue(30,2) // output is True 
IsBitTrue(30,3) // output is True

Функция будет называться много раз в секунду, поэтому быстрый алгоритм необходимо .. Ваша помощь очень высоко ценится: D

+5

"немного сложнее" ... каламбур? – seth

ответ

6

Распечатать эту страницу из, нависают над монитор

http://graphics.stanford.edu/~seander/bithacks.html

Но это примерно то вроде

если (стоимость & (1 < < bit_number))

+0

или bitnumber-1 в зависимости от того, как вы их считаете –

+0

Я думаю, вы имеете в виду 1 вместо 2 или '**' вместо '<<'. –

+0

Да, я понял, как только я нажал кнопку ввода, но потом он не разрешил мне редактировать его в течение пары минут. –

4

Действительно?

def IsBitTrue(num, bit): 
    return (num & (1 << (bit-1))) > 0 

Как правило, это будет 1 < < немного, но так как вы хотели проиндексировать LSB, как 1 ...

+0

+1. хороший, быстрый ответ! –

0

Используйте «легкой» функции, чтобы преобразовать десятичное число в двоичный, а затем сравните с битовой маской, представляющей бит, который вы тестируете.

+0

Точно так же, как ответ @Mark Rushakoff! –

0

Python

def isBitTrue(number, position): 
    mask = 1 << (position-1) 
    return bool(number & mask) 

Если номер позиции от 0 (вместо 1), вы можете сэкономить массу времени.

>>> isBitTrue(30,1) 
False 
>>> isBitTrue(30,2) 
True 
>>> isBitTrue(30,3) 
True 
+0

Это тонна времени, при этом сравнение «python -m timeit -n 1000» для n в xrange (1,10000): n & (1 << (12)) "' с 'python -m timeit - n 1000 "для n в xrange (1,10000): n & (1 << (12-1))" ' –

0
bool IsBitTrue(int num , int pos) 
{ 
return ((num>>pos-1)%2==1) 
}