Mateusz Buczkowski - 2007-11-21 15:23:52

#include <iostream>
using namespace std;

int encode(int m)
{
    int x;
   
    x=((m ^ (m>>4) ^ (m>>7) ^ (m>>10))&1 ) |  ( (((m>>2) ^ (m>>6) ^ (m>>8) ^ (m>>11))&1)<<1);
 

    return x;
}

int main()
{
    int y;
    cout<<"Podaj liczbe:";
    cin>>y;
    cout<<encode(y)<<endl;
    system("pause");
}


Póki co sam kod. Wieczorem będę miał czas to może opiszę trochę, co, jak i dlaczego ;)

EDIT: Tak popatrzyłem na ten mój kod i stwierdziłem, że można go trochę uprościć, bo niepotrzebnie znajdowały się tam śmieci typu &1 :P
A teraz jakieś krótkie wyjaśnienie może...
Użytkownik wprowadza pewną liczbę całkowitą w systemie dziesiętnym. To co nas interesuje, to konkretne pozycje z zapisu binarnego tej liczby [dokładniej, mamy powiedzieć czy suma cyfr na tych pozycjach jest równa jeden czy zero].
To tyle jeśli chodzi o wstęp teoretyczny :P Teraz trochę kodu :P

(m ^ (m>>4) ^ (m>>7) ^ (m>>10))&1

Ta część kodu odpowiada za pozycję zerową naszej liczby wyjściowej [którą jest x]. Co ona robi? mamy np. liczbę m=110001101101.
Wykona się mniej więcej coś takiego:

110001101101  ^
000011000110 =  // ta liczba to m>>4, czyli m przesunięte o 4 bity w prawo. Wynikiem tego działania będzie mniej więcej coś takiego:
110010101011     // No ale to nie koniec, bo dodajemy jeszcze do tego m>>7

110010101011 ^
000000011000 =  //(m^(m>>4))^m>>7 ... itd
110010110011

110010110011 ^
000000000011 =  //((m^(m>>4))^m>>7)^(m>>10)
110010110000

Uzyskaliśmy w ten sposób pewną liczbę, ale nas interesuje jedynie znak na pozycji zerowej, dlatego nasz wynik porównujemy z maską = 000000000001 czyli po prostu liczbą 1. W wyniku tego działania otrzymamy:

110010110000 &
000000000001  =
000000000000

Druga część odbywa się analogicznie do tej, z tym że jest jeszcze dodatkowa operacja, a mianowicie <<1. Po co ona tam siedzi? Chodzi po prostu o to, że suma z pozycji 2,6,8 i 11 miała być umieszczona na pierwszym bicie liczby wyjściowej, dlatego trzeba ją przesunąć z bitu zerowego na pierwszy.

PS. Chyba komuś już mówiłem, że nie umiem tłumaczyć :P Tutaj się to doskonale potwierdza :P

GotLink.plklej do luster