2009-07-30 14 views
0

Es ist einfach zu konvertieren Dezimal zu Binär und umgekehrt in jeder Sprache, aber ich brauche eine Funktion, die ein bisschen komplizierter ist.Dezimal zu Bit (Binär)

Gegeben eine Dezimalzahl und eine binäre Stelle, muss ich wissen, ob das binäre Bit On oder Off (True oder False) ist.

Beispiel:

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

Die Funktion viele Male pro Sekunde aufgerufen wird, so dass ein schneller Algorithmus notwendig ist .. Ihre Hilfe sehr geschätzt wird: D

+5

"etwas komplizierter" ... Wortspiel beabsichtigt? – seth

Antwort

6

drucken Seite, hängen oben Ihr Monitor

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

Aber es ist in etwa so etwas wie

if (Wert & (1 < < bit_number))

+0

oder bitnumber-1 je nachdem, wie Sie sie zählen –

+0

Ich denke, du meinst 1 statt 2, oder '**' anstelle von '<<'. –

+0

Ja, ich merkte, gerade als ich Enter drücke, aber dann ließ es mich nicht für ein paar Minuten bearbeiten –

4

Wirklich?

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

Normalerweise würde es 1 < < Bit sein, aber da Sie indizieren wollte das LSB als 1 ...

+0

+1. nette, schnelle Antwort! –

0

Ihre ‚easy‘ Funktion können Sie die Dezimalzahl in Binär-konvertieren, und dann Vergleichen Sie mit einer Bitmaske, die das Bit darstellt, das Sie testen.

+0

, genau wie @Mark Rushakoffs Antwort !! –

0

Python

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

Wenn Sie die Nummer, die Positionen von 0 (statt 1), können Sie eine Menge Zeit sparen.

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

Es ist eine Menge Zeit, um zu vergleichen, Python -m timeit -n 1000 "für n in xrange (1.10000): n & (1 << (12))" 'mit' Python -m Zeit - n 1000 "für n in xrange (1,10000): n & (1 << (12-1))" ' –

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