webForumDet fria alternativet

Kan man kolla om en viss bit är satt?

PHP

9 svar · 380 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

Sökte, men angav kanske fel sökord, för jag fick inget napp.

Mitt problem: Jag har variabeln $i som jag VET håller i en integer s.a.
0 <= $i <= 15. Det skulle vara trevligt om det fanns ett sätt att kolla vilka bitar i talet som är satta.

Alltså ex: $i = 7 ==> binärt 0111. Finns det någon funktion f som:
f($i, 0) ==> 1, f($i, 1) ==> 1, f($i, 2) ==> 1, f($i, 3) ==> 0

Eller hur löser man det? Om det överhuvudtaget går att göra tjusigare än att kolla om den är udda och dividera med 2 successivt...

Tacksam för svar! :)

Medlem sedan mars 20007 896 inlägg
#2

Tja, det kan man ju alltid knåpa ihop annars för jag tror inte att det finns:

function f( $myInt, $pos ) {
     if( !is_integer( $myInt ) && is_numeric( $myInt ) )
          $myInt = ( int ) $myInt;     

     if( is_integer( $myInt ) ) {
          $binArray = decbin( myInt );
          return $binArray[ $pos ];
     } else {
          return false;
     }
}

Lite enkelt gjort. Självklart kan man göra funktionen mer komplex och användbar, men det orkade jag inte just nu - det är ju fotboll på TV. Säg till om du vill ha mer vägledning.

Medlem sedan juni 20008 205 inlägg
#3

Re: Kan man kolla om en viss bit är satt?

aasah skrev:

Alltså ex: $i = 7 ==> binärt 0111. Finns det någon funktion f som:
f($i, 0) ==> 1, f($i, 1) ==> 1, f($i, 2) ==> 1, f($i, 3) ==> 0

Eller hur löser man det? Om det överhuvudtaget går att göra tjusigare än att kolla om den är udda och dividera med 2 successivt...

Mums, bitmanipulering! Det ballaste som finns! :D
För att kolla vilka bitar som är satta använder du vänsterskift och bitvis AND, och så utnyttjar du det faktum att 1 är binärt 00000001 (om man har en unsigned byte... bla bla bla...). Exempelvis, vill du kolla om den tredje biten från vänster är satt, gör du så här:

if ($integern & (1 << 3)) {
    // biten är på
}
Medlem sedan mars 20007 896 inlägg
#4

Gha, så klart. :e

Medlem sedan sep. 2001788 inlägg
#5

Re: Kan man kolla om en viss bit är satt?

aasah skrev:

ett sätt att kolla vilka bitar i talet som är satta

Kanske en dum fråga men varför vill man veta det?
E det en dum och okunnig fråga så e det en kompis som vill veta och inte jag. :r

Medlem sedan juni 20008 205 inlägg
#6

Därför att man då kan klämma in en massa information i en och samma variabel. Tänk dig att du vill ha en klass som motsvarar en font, som du kan välja om den ska vara över-, genom-, och understruken samt fet och/eller kursiv stil. Då definierar man bitmönster för varje alternativ och låter tillämpningsprogrammerarna slå ihop olika bitmönster med | (bitvis OR), och så behöver man bara ett argument till funktionen/klassen.

Medlem sedan sep. 2001788 inlägg
#7

Men tjena, det verkar ju vara riktigt najs.
Tackar för svaret. :bire

Finns det någon som håller i en artikel/information i ämnet så får jättegärna länken postas här. :)

Medlem sedan juni 20008 205 inlägg
#8

Det är ganska enkelt. Kika på koden på http://www.zend.com/codex.php?id=99&single=1

Medlem sedan mars 20034 471 inlägg
#9

Re: Re: Kan man kolla om en viss bit är satt?

Tusen tack för svaret, spango! :D Smart! :D

Men...

spango skrev:

... Exempelvis, vill du kolla om den tredje biten från vänster är satt, gör du så här:

if ($integern & (1 << 3)) {
    // biten är på
}

... detta ger faktiskt fjärde biten från vänster. Eftersom första biten ges av $integern & 1, andra ges av $integern & (1 << 1), ....

Medlem sedan juni 20008 205 inlägg
#10

D'oh! :o Såklart.

255 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)