Meddelande

Minska
No announcement yet.

Bit-operator

Minska
X
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • Bit-operator

    Hej!

    Jag skulle behöva hjälp med varför man använder sig av n >> c i denna kodsnutten.
    Jag förstår att den flyttar bitarna, men varför?

    [kod]#include <stdio.h>

    int main()
    {
    int n, c, k;

    printf("Enter an integer in decimal number system\n");
    scanf("%d", &n);

    printf("%d in binary number system is:\n", n);

    for (c = 10; c >= 0; c--)
    {
    k = n >> c;
    if (k & 1) /
    printf("1");
    else
    printf("0");
    }

    fflush(stdin);
    getchar();
    return 0;
    }[/kod]
    Last edited by @nders; 2013-02-28, 07:58. Anledning: [kod]-taggar för läsbarhet

  • #2
    Hej. Skiftningen går ut på att välja ut en bit från numret. Först skiftas hela numret till höger så att biten du vill titta på hamnar i bit 0 (biten längst till höger) sedan and-as resultatet med 1, som har biten längst till höger satt, så att bara den biten plockas ut. Säg till exempel att du matar in 328. Binärt blir det 00101001000. Loopen går från 10 och neråt till noll. Då sker följande:
    [kod]n = 00101001000

    Loopen börjar.
    c = 10(decimalt)
    00101001000 n
    00000000000 k = n >> c
    00000000001 1
    00000000000 k & 1

    c = 9 (decimalt)
    00101001000 n
    00000000000 k = n >> c
    00000000001 1
    00000000000 k & 1

    c = 8 (decimalt)
    00101001000 n
    00000000001 k = n >> c
    00000000001 1
    00000000001 k & 1

    c = 7 (decimalt)
    00101001000 n
    00000000010 k = n >> c
    00000000001 1
    00000000000 k & 1

    c = 6 (decimalt)
    00101001000 n
    00000000101 k = n >> c
    00000000001 1
    00000000001 k & 1

    c = 5 (decimalt)
    00101001000 n
    00000001010 k = n >> c
    00000000001 1
    00000000000 k & 1

    c = 4 (decimalt)
    00101001000 n
    00000010100 k = n >> c
    00000000001 1
    00000000000 k & 1

    c = 3 (decimalt)
    0101001000 n
    0000101001 k = n >> c
    0000000001 1
    0000000001 k & 1

    c = 2 (decimalt)
    0101001000 n
    0001010010 k = n >> c
    0000000001 1
    0000000000 k & 1

    c = 1 (decimalt)
    0101001000 n
    0010100100 k = n >> c
    0000000001 1
    0000000000 k & 1

    c = 0 (decimalt)
    0101001000 n
    0101001000 k = n >> c
    0000000001 1
    0000000000 k & 1
    [/kod]Bara för att vara övertydlig. n >> c flyttar bitarna åt höger. De bitar som skiftas ut kastas bort. På vänstersidan fylls talet på med nollor.
    Fetmarkering = de bitar som "överlever" skiftningen, dvs varken skiftas ut eller är nya nollor.
    Understruket = den biten som undersöks i den rotationen av loopen.

    För övrigt. En något tänkvärt är att högerskiftning i x steg är samma sak som heltalsdivision med 2, x st gånger.
    T ex, n>>2 = n/4 (=n/2/2)
    och n>>4 = n/16 (=n/2/2/2/2)

    (edit)
    Gameboy Genius - Foto: Gatukonst och elektronikporr
    Internklippning:
    1) Snaggning av fångar.
    2) Klippning frisörer emellan.

    Kommentera


    • #3
      Tacktack!

      Akrivera eller radera

      Kommentera


      • #4
        Ingetdera. Däremot kan du själv markera ett svar som lösning med länken ovanför inlägget. (Fast nu gör jag det istället.)
        Gameboy Genius - Foto: Gatukonst och elektronikporr
        Internklippning:
        1) Snaggning av fångar.
        2) Klippning frisörer emellan.

        Kommentera

        Working...
        X