Autor Wątek: Zagadki językoznawcze  (Przeczytany 55185 razy)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 05, 2009, 23:54:41
IMO kod Krzyśka K to algorytm na największy wspólny dzielnik. W pamięci wyszedł mi dzielnik 16. (65536 to 2 do którejśtam, a dzieląc 10000 przez 2 wychodzi po kolei: 5000, 2500, 1025).
Brawo. Algorytm Euklidesa, aczkolwiek wyznaczanie reszty z dzielenia jest zrobione w dość nietypowy i nieefektywny sposób. :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline raver

  • Użytkownik
    • Moja strona domowa.

# Kwiecień 06, 2009, 00:18:40
int main()
{
  int k = 10000;
  std::cout << (k&-k);
}

Tą sztuczkę pokazał mi kolega na OI, zgadujcie co wyjdzie :).

Offline Qu4

  • Użytkownik

  • Zbanowany
# Kwiecień 06, 2009, 00:25:21
To i ja sypne kilkoma kodami w C:

(odpal z parametrami nazwa par1 par2 ...)
Kod: (cpp) [Zaznacz]
main(Q,O)char**O;{if(--Q){main(Q,O);O[Q][0]^=0X80;for(O[0][0]=0;O[++O[0][0]]!=0;)if(O[O[0][0]][0]>0)puts(O[O[0][0]]);puts("----------");main(Q,O);}}

Kod: (cpp) [Zaznacz]
cat =13; main() {
      write(
cat-~-cat
     
     ,"Hello, world!"
     ,
cat); putchar(~-~-~-cat); } /*
     ,)')
      end
*/

Kod: (cpp) [Zaznacz]
typedef char*z;O;o;_=33303285;main(b,Z)z Z;{b=(b>=0||(main(b+1,Z+1),*Z=O%(o=(_%
25))+'0',O/=o,_/=25))&&(b<1||(O=time(&b)%0250600,main(~5,*(z*)Z),write(1,*(z*)Z
,9)));}

Kod: (cpp) [Zaznacz]
main(n,i,a,m){while(i=++n)
for(a=0;a<i?a=a*8+i%8,i/=8,m=a==i|a/8==i,1:(n-++m||printf("%on",n))&&n%m;);}
« Ostatnia zmiana: Kwiecień 06, 2009, 00:27:14 wysłana przez Qu4 »

Offline mawpa

  • Użytkownik

# Kwiecień 06, 2009, 00:33:01
int main()
{
  int k = 10000;
  std::cout << (k&-k);
}

Tą sztuczkę pokazał mi kolega na OI, zgadujcie co wyjdzie :).
16. Dlatego, że:
10000 dec = 10011100010000 bin
-10000 dec = 01100011110000 bin
10011100010000 & 01100011110000 = 10000
10000 bin = 16 dec

Gdyby ktoś się czepiał, że -10000 dec != 01100011110000 bin, wyjaśniam, że obciąłem niepotrzebne bity.
« Ostatnia zmiana: Kwiecień 06, 2009, 00:35:13 wysłana przez Ku_Zi »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 06, 2009, 03:33:47
Cytuj
Gdyby ktoś się czepiał, że -10000 dec != 01100011110000 bin, wyjaśniam, że obciąłem niepotrzebne bity.
Tak... w szczególności bit znaku, przez co nie idzie z reprezentacji bitowej wywnioskować, że to liczba ujemna. ;)

Offline Qu4

  • Użytkownik

  • Zbanowany
# Kwiecień 06, 2009, 14:05:19
Cytuj
Gdyby ktoś się czepiał, że -10000 dec != 01100011110000 bin, wyjaśniam, że obciąłem niepotrzebne bity.
Tak... w szczególności bit znaku, przez co nie idzie z reprezentacji bitowej wywnioskować, że to liczba ujemna. ;)
No i co z tego? Obciął bit znaku bo w tym przypadku był bez znaczenia. Chyba każdy wie o co chodzi.
1...xx
&
0...yy
=
0...zz
« Ostatnia zmiana: Kwiecień 06, 2009, 14:11:04 wysłana przez Qu4 »

Offline Aithne

  • Użytkownik

# Kwiecień 06, 2009, 16:10:11
Kod: (cpp) [Zaznacz]
cat =13; main() {
      write(
cat-~-cat
     
     ,"Hello, world!"
     ,
cat); putchar(~-~-~-cat); } /*
     ,)')
      end
*/
Stdout (zakładając kod uzupełnień do 2): SOH, Hello World!, CR, LF.
« Ostatnia zmiana: Kwiecień 06, 2009, 16:13:08 wysłana przez Aithne »

Offline Shelim

  • Użytkownik
    • Homepage

# Kwiecień 06, 2009, 22:46:27
Proste ;-)

int q = 128<<8<<8<<8;

cout << -q/q << endl;

Offline Xion

  • Moderator
    • xion.log

# Kwiecień 07, 2009, 01:44:54
Proste ;-)

int q = 128<<8<<8<<8;

cout << -q/q << endl;
Zdaje się, że q to:
int q = 1<<7<<8<<8<<8;czyli 1<<32 - a przy takim przesunięciu jedynka wyjdzie poza najbardziej znaczący bit i q będzie miało wartość zero. Stąd rezultatem programu będzie wyjątek dzielenia przez zero :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 07, 2009, 02:07:25
Cytuj
int q = 1<<7<<8<<8<<8;

czyli 1<<32
Czyli 7+8+8+8 = 32? Ciekawa teoria. ;)


Skoro bawimy się przesunięciami, zagadka, co wypluje poniższy kod (załóżmy, że kompilatorem jest 32-bitowy Visual C++). ;)
int foo(int a,int b)
{
    return a << b;
}

printf("%d\n",foo(5,1000));
« Ostatnia zmiana: Kwiecień 07, 2009, 02:10:44 wysłana przez Krzysiek K. »

Offline Aithne

  • Użytkownik

# Kwiecień 07, 2009, 08:45:56
int q = 128<<8<<8<<8;

cout << -q/q << endl;
Jako że nikt tego jeszcze nie rozwiązał... Hm... 1 << 31 to -2^31, po zaminusowaniu da 0, a 0 przez X (gdzie X to nie 0) da 0.
@up: wszystko wyleci poza liczbę i da to 0.
« Ostatnia zmiana: Kwiecień 07, 2009, 08:52:36 wysłana przez Aithne »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 07, 2009, 10:09:52
Cytuj
Hm... 1 << 31 to -2^31, po zaminusowaniu da 0
Nie da. -0x80000000 = (~0x80000000) + 1 = 0x7FFFFFFF + 1 = 0x80000000. :)

Offline Aithne

  • Użytkownik

# Kwiecień 07, 2009, 11:43:09
Aaarrrggghhh! Fakt, jeśli chodzi o arytmetykę w U2, to trochę głupia jestem. W takim razie będzie 1.

Offline Shelim

  • Użytkownik
    • Homepage

# Wrzesień 19, 2009, 21:41:29
Przypomnę temat, bo ostatnio trafiłem na coś bardzo dziwnego.

Załóżmy maszynę na której char ma defaultowo 2 bajty.

Ile będzie sizeof(char) ? :)

Offline Dab

  • Redaktor
    • blog

# Wrzesień 19, 2009, 21:42:51
1 :)

To i ja mam zagadkę:
#include <iostream>
namespace A
{
    class Zlo { };
    int foo(Zlo z, double a) { return 1; }
};
namespace B
{
    int foo(A::Zlo z, int a) { return 0; }
    void drukuj()
    {
        A::Zlo kot;
        std::cout << foo(kot, 1.0) << std::endl;
    }
}
int main()
{
    B::drukuj();
    return 0;
}

Jaki będzie wynik? :)

[edit] literówka
« Ostatnia zmiana: Wrzesień 19, 2009, 22:04:16 wysłana przez Dab »