tamsayılar
Genellikle iki katını kullanmak istemiyoruz çünkü kayan nokta opsunu, yuvarlama hatalarını vb. Kullanmak istemiyoruz.
Bunun için tavan bölümünün nasıl yapılacağını hatırlamak iyi bir fikirdir: ceil(x / y)
çiftler olarak (x + y - 1) / y
(negatif sayılardan kaçınırken, taşmalara karşı dikkatli olun) olarak yazılabilir .
Okunabilir
Okunabilirlik için giderseniz, elbette bu şekilde de programlayabilirsiniz (Java'da, örneğin C için makroları kullanabilirsiniz):
public static int ceilDiv(int x, int y) {
return (x + y - 1) / y;
}
public static int paddedBase64(int n) {
int blocks = ceilDiv(n, 3);
return blocks * 4;
}
public static int unpaddedBase64(int n) {
int bits = 8 * n;
return ceilDiv(bits, 6);
}
// test only
public static void main(String[] args) {
for (int n = 0; n < 21; n++) {
System.out.println("Base 64 padded: " + paddedBase64(n));
System.out.println("Base 64 unpadded: " + unpaddedBase64(n));
}
}
inlined
Yastıklı
Her 3 bayt (veya daha az) için 4 karakter bloğuna ihtiyacımız olduğunu biliyoruz. Böylece formül olur (x = n ve y = 3 için):
blocks = (bytes + 3 - 1) / 3
chars = blocks * 4
veya kombine:
chars = ((bytes + 3 - 1) / 3) * 4
derleyiciniz optimize eder 3 - 1
, bu yüzden okunabilirliği korumak için böyle bırakın.
unpadded
Daha az yaygın olan unpadded varyantı, çünkü bunun her birinin her 6 bit için yuvarlatılmış bir karaktere ihtiyacımız olduğunu hatırlarız:
bits = bytes * 8
chars = (bits + 6 - 1) / 6
veya kombine:
chars = (bytes * 8 + 6 - 1) / 6
ancak yine de ikiye bölebiliriz (eğer istiyorsak):
chars = (bytes * 4 + 3 - 1) / 3
okunamayan
Derleyicinizin sizin için son optimizasyonları yapmasına güvenmiyorsanız (veya meslektaşlarınızı karıştırmak istiyorsanız):
Yastıklı
((n + 2) / 3) << 2
unpadded
((n << 2) | 2) / 3
İşte buradayız, iki mantıksal hesaplama yöntemi ve gerçekten istemedikçe herhangi bir şubeye, bit-op veya modulo op'a ihtiyacımız yok.
Notlar:
- Bir boş sonlandırma baytı eklemek için hesaplamalara 1 eklemeniz gerekebilir.
- Mime için olası satır sonlandırma karakterlerine ve benzerlerine dikkat etmeniz gerekebilir (bunun için başka cevaplar arayın).