#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
|