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
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);
}
}
Nasıl bu kişinin kod &; Merhaba Dünya&...
Neden bu kod rastgele dizeleri yazdırm...
Nasıl değişmez bir " baskı miyim;{}&qu...
Nasıl 'Merhaba Dünya' Manage...
Nasıl "listesi Oluşturma Ayarları...