PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie schauen, ob in zahl das 2. bit gesetzt ist



msi
21-12-2004, 17:09
Hallo,

wie kann ich in einer großen zahl schauen, ob das 2. bit (also der 2er im dualsystem) gesetzt ist?
Das ganze soll natürlich möglichst performant ablaufen, bisher konvertiere ich die zahl in einen string, der die zahl im dualsystem umgekehrt (also letztes zeichen wird erstes usw.) darstellt und überprüfe dann ob das 2. zeichen auf 1 ist (also mit $string[1] == 1).

Markus

BlueJay
21-12-2004, 17:25
wie kann ich in einer großen zahl schauen, ob das 2. bit (also der 2er im dualsystem) gesetzt ist?


äh, zahl%4>1?

so long

Pingu
21-12-2004, 18:05
oder über einen logischen Operator:
$erg = ($zahl & 0x02) ? "gesetzt" : "nicht gesetzt";

Pingu

msi
21-12-2004, 20:57
danke, hätt ich auch selber drauf kommen können ;)
wieso schreibst du 0x02 und nicht einfach 2?? was ist der unterschied?

Markus

msi
21-12-2004, 21:15
allgemein kann ichs dann so ausrechnen,
wobei $st die stelle ist (im obrigen fall 2) und $zahl die zahl:



$zahl%(pow(2,$st))>($st-1))&&(pow(2,$st-1)<=$zahl


wie würde soetwas mit logischen operatoren aussehen?

danke Markus

Joghurt
22-12-2004, 00:44
Nutze doch einfach den Shift-operator

$zahl & (1<<$st)
$st beginnt bei 0.

BTW: 0x bedeutet, dass die Zahl im Hexadezimalsystem angegeben wird. Das hat den Vorteil, dass jede Ziffer für genau 4 bit steht. Um also z.B. bit 4 (bei 0 angefangen zu zählen) zu prüfen, musst du entweder
$zahl & 16 schreiben, oder $zahl & 0x10, was einfacher ist. Bit 31 wäre z.B. $zahl & 0x80000000 oder $zahl & 2147483648. Ich denke, du siehst den Zweck ;)

msi
22-12-2004, 15:11
danke!

wie mache ich dasselbe bei einem 3er system?
also auwerten welchen wert (0,1 oder 2) das x. zeichen hat.

Markus

Joghurt
22-12-2004, 17:22
Da musst du mit pow und mod arbeiten.

Wie im Zehnersystem. bei 1234 bekommst du die hunderter mit 1234/10^2 % 10

Also:
$zahl / pow($basis,$stelle) % $basisoder auch (vielleicht etwas schneller, aber in Zeiten von Coprozzis unwichtig)
$digit = $zahl;
while ($stelle >0) {
$digit = $digit / $basis
$stelle = $stelle - 1;
}
$digit = $digit % $basis

BlueJay
23-12-2004, 10:51
mathematisch, aber mal ganz ohne power und in 1 Rutsch :)

zahl%4==3

nu fehlt nur noch Pingus Bitmask-Variante , auch in 1 Rutsch:

(zahl & 3)==3

so long und
Frohes Fest!

Joghurt
23-12-2004, 11:54
zahl%4==3
(zahl & 3)==3:confused:
Bei beiden Varianten testest du nur, ob die letzte Zifffer im Vierersystem eine 3 ist. Nicht mehr und nicht weniger. Der Zusammenhang zu dem eigentlichen Problem ist mir jetzt nicht ganz klar...

PS: Falls du dich auf die ursprüngliche Frage beziehen solltest (2. bit testen), müsste es
zahl & 2 != 0 (oder == 2)
oder zahl%4 >= 2heißen

BlueJay
26-12-2004, 21:01
:confused:
Bei beiden Varianten testest du nur, ob die letzte Zifffer im Vierersystem eine 3 ist.


Ups, Frage falsch gelesen!