Avatar billede zeptic Nybegynder
27. juni 2002 - 13:31 Der er 7 kommentarer og
1 løsning

Antal forskellige bits

Findes der en kommando, eller evt. lynhurtig funktion, der kan tage to tal, og så fortælle hvor mange bit der er forskellige.

Eks.:

255 = 11111111,  128 = 10000000
forskel(255,128)=7

Faktisk skal jeg ikke bruge antallet af bits, men kun se om de er 1 bit forskellige.

Funktionen skal kaldes sindssygt mange gange og programmets succes afhænger af, at det kan gøres lynende hurtigt.

Nogen gode ideer?
Avatar billede chries Nybegynder
27. juni 2002 - 14:12 #1
har ikke lige testen den, men prøv:

unsigned char func( unsigned char v1, unsigned char v2 )
{
  unsigned char r = v1^v2;
  unsigned char number = 0;

  for( unsigned char i=0; i<8; i++ )
  {
      if( r&(1<<i) )
      {
          number++;
      }
  }

  return number;
}
Avatar billede chries Nybegynder
27. juni 2002 - 14:14 #2
ser ud til at virke:

int main(int argc, char* argv[])
{
    unsigned char t1 = 0x0F;
    unsigned char t2 = 0xFF;

    unsigned char r = func(t1, t2);

    return 0;
}

r == 4
Avatar billede chries Nybegynder
27. juni 2002 - 14:17 #3
hvis du kun vil vide om de er forskellige:

unsigned char forskellige( unsigned char v1, unsigned char v2 )
{
  return ( v1^v2 );
}

if( forskellige( ... ) )
{

}
Avatar billede zeptic Nybegynder
27. juni 2002 - 15:18 #4
hvad gør ^ ??
Avatar billede chries Nybegynder
27. juni 2002 - 15:21 #5
det er binær xor (exclusive or)

10011001b
11110000b ^
01101001b

1^1 = 0
0^0 = 0
1^0 = 1
0^1 = 1
Avatar billede zeptic Nybegynder
27. juni 2002 - 15:52 #6
er der nogen måde hvorpå man nemt kan lægge de satte bit sammen? på den måde kan jo tage xor af de 2 tal og hvis antallet af satte bit i resultatet er 1, så afviger de 2 oprindelige tal fra hinanden kun med en bit.
Avatar billede jpk Nybegynder
27. juni 2002 - 15:54 #7
Du kan sansynligvis få lidt mere hastighed, hvis du laver funktionen inline...
Avatar billede zeptic Nybegynder
27. juni 2002 - 15:54 #8
selvfølgelig uden at man behøver at røre hver enkelt bit via <<.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester