SORU
21 Aralık 2013, CUMARTESİ


Bu nasıl baskı&; Merhaba Dünya""?

Bu gariplik keşfettim

for (long l = 4946144450195624l; l > 0; l >>= 5)
    System.out.print((char) (((l & 31 | 64) % 95)   32));

Çıkış:

hello world

Nasıl oluyor bu iş?

CEVAP
24 Aralık 2013, Salı


9* *Sayı 64 bit uyar, ikili gösterimi

 10001100100100111110111111110111101100011000010101000

Program soldan sağa 5-bit her grup için bir karakter, çözer

 00100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000
   d  |  l  |  r  |  o  |  w  |     |  o  |  l  |  l  |  e  |  h

5-bit kodlama

5 bit için, 2⁵ = 32 karakteri temsil etmesi için doktorunun. İngiliz alfabesinin 26 harfi, bu 32 - 26 = 6 semboller için yer bırakır içerir mektuplar dışında. Bu kodlama şeması ile 26 bir şekilde İngilizce harfler ve 6 simgeleri (aralarında boşluk var) alabilirsin.

Algoritma açıklama

-İlmek, daha sonra 5-bit gruptan gruba atlar grubunda >>= 5 maske cümle l & 31 13 *sayı Kullanılır izole alır

Şimdi kod haritalar 5-bit karşılık gelen değer 7-bit ascıı karakter. İşin zor kısmı, küçük harf için bir ikili temsilleri kontrol edin. aşağıdaki tabloda harfler alfabe:

  ascii   |     ascii     |    ascii     |    algorithm
character | decimal value | binary value | 5-bit codification 
--------------------------------------------------------------
  space   |       32      |   0100000    |      11111
    a     |       97      |   1100001    |      00001
    b     |       98      |   1100010    |      00010
    c     |       99      |   1100011    |      00011
    d     |      100      |   1100100    |      00100
    e     |      101      |   1100101    |      00101
    f     |      102      |   1100110    |      00110
    g     |      103      |   1100111    |      00111
    h     |      104      |   1101000    |      01000
    i     |      105      |   1101001    |      01001
    j     |      106      |   1101010    |      01010
    k     |      107      |   1101011    |      01011
    l     |      108      |   1101100    |      01100
    m     |      109      |   1101101    |      01101
    n     |      110      |   1101110    |      01110
    o     |      111      |   1101111    |      01111
    p     |      112      |   1110000    |      10000
    q     |      113      |   1110001    |      10001
    r     |      114      |   1110010    |      10010
    s     |      115      |   1110011    |      10011
    t     |      116      |   1110100    |      10100
    u     |      117      |   1110101    |      10101
    v     |      118      |   1110110    |      10110
    w     |      119      |   1110111    |      10111
    x     |      120      |   1111000    |      11000
    y     |      121      |   1111001    |      11001
    z     |      122      |   1111010    |      11010

Burada gördüğünüz gibi bu ascıı karakterler istediğimiz için harita başlayacak olan 7. ve 6. biti (11xxxxx₂) (hariç alan, sadece 6 bit) olabilir OR 5-bit 96 (96₁₀ = 1100000₂) ve eşleme yapmak için yeterli olmalıdır, ama uzay için işe yaramaz ile kodlama (space lanet olsun!)

Şimdi özel bakım diğer karakterler gibi aynı zamanda uzay sürece dahil edilmesi gerektiğini biliyoruz. Bunu başarmak için, kodu 7 bit (6) yanar bir VEYA 64 64₁₀ = 1000000₂ (l & 31 | 64)5-bit grup çıkarılan.

5-bit grup formunun ana kadar: 10xxxxx₂ (alanı 1011111₂ = 95₁₀ olabilir). Eğer diğer değerler unaffecting 0 uzay harita edebilirsek, daha sonra 6 bit altüst edebiliriz ve tüm olmalıdır. mod 95 kısmı devreye giriyor işte, alan 1011111₂ = 95₁₀ mod kullanarak çalışma alanı sadece geri 0, gider ve bundan sonra kod 6 bit 32₁₀ = 100000₂ekleyerek yanar (l & 31 | 64) % 95) geçerli bir ascıı karakter içine 5 bit değeri dönüştüren bir önceki sonucu ((l & 31 | 64) % 95) 32)

isolates 5 bits --            ---- takes 'space' (and only 'space') back to 0
                  |          |
                  v          v
               (l & 31 | 64) % 95)   32
                       ^           ^ 
       turns the       |           |
      7th bit on ------             --- turns the 6th bit on

Aşağıdaki kodu ters işlem, küçük bir dize (en fazla 12 karakter) verilen, döner OP kodu ile kullanılabilecek 64 bit uzun değeri:

public class D {
    public static void main(String... args) {
        String v = "hello test";
        int len = Math.min(12, v.length());
        long res = 0L;
        for (int i = 0; i < len; i  ) {
            long c = (long) v.charAt(i) & 31;
            res |= ((((31 - c) / 31) * 31) | c) << 5 * i;
        }
        System.out.println(res);
    }
}    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • gsipek

    gsipek

    20 Temmuz 2007
  • Top10Series

    Top10Series

    26 Kasım 2008