Forum grupy T2 I Roku EiT


#1 2007-11-21 15:23:52

Mateusz Buczkowski

UÂżytkownik

1965860
Zarejestrowany: 2007-10-04
Posty: 23
Punktów :   

Śmieszne binarne :P

#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

 

#2 2007-11-21 18:24:06

n!

Nowy uÂżytkownik

1680382
Zarejestrowany: 2007-10-07
Posty: 9
Punktów :   

Re: Śmieszne binarne :P

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

 

Stopka forum

RSS
Powered by PunBB 1.2.23
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
GotLink.plwww.rilko.pl www.piesku.pl www.zarazenipodroza.pl