UÂżytkownik
#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
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 Teraz trochę kodu
(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ć Tutaj się to doskonale potwierdza
Ostatnio edytowany przez Mateusz Buczkowski (2007-11-22 11:24:03)
Offline
tutaj rozpisane na wiecej zmiennych, prostsze do pojecia
#include <iostream>
using namespace std;
int encode(int m)
{
int asum = m ^ (m >> 4) ^ (m >> 7) ^ (m >> 10);
int bsum = (m >> 2) ^ (m >> 6) ^ (m >> 8) ^ (m >> 11);
int mask = 1;
asum = asum & mask;
bsum = bsum & mask;
return (bsum << 1) | asum;
}
int main()
{
cout << "m: ";
int m;
cin >> m;
cout << encode(m);
return 0;
}
Ostatnio edytowany przez n! (2007-11-21 18:24:42)
Offline