Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- // приклад створення реальних байтів з бітових абстракцій де зберігаємо закодовані послідовністі - далі коди
- public class Main {
- public static void main(String[] args) {
- // довжина коду (рівнодовгі коди)
- int codeLength = 3;
- // коди можна представити інтами, ми то знаємо що в "душі" вони такі 00000000 00000001 00000010 00000011 ...
- // можна зберігати їх чи в стрінгах, чи в масивах булінів наприклад, як завгодно - а на етапі
- // формування закодованого байту обрана вами абстракція має перетворитися на біти для нього
- int[] codes = {0, 1, 2, 3, 4, 5, 6, 7}; // 000 001 010 011 100 101 110 111
- // 000 001 01 = 5
- // 0 011 100 1 = 57
- // 01 110 111 = 119
- // т.я. довжина коду = 3, маска відповідно для взяття трох молодших бітів
- int mask = 0b00000111; // 7; кількіст включених молодших бітів дорівнює довжині коду. Таку маску можна обчислити:
- int anyCodeLength = 3; // від довжини кодованої послідовності
- int eMask = ((int) Math.pow(2, anyCodeLength) - 1); // ця формула використовується нижче, тут для пояснення
- System.out.println("the eMask for code length = " + anyCodeLength + " is " + eMask + " (bin:) " + (Integer.toBinaryString(eMask)));
- int encodedByte = 0; // закодований байт, його будемо формувати - заповнювати бітами
- int code = 0; // поточний код (закодована послідовність)
- // writedBitCount - кількість бітів вже записаних до формуємого байту
- for (int i = 0, writedBitCount = 0; i < codes.length; i++) {
- // формуємо зжатий (закодований) байт з кодів, перетворюючи їх на біти в ньому з абстракції де вони зберігалися
- code = codes[i] & mask; // маска що залише лише три молодші біти в коді, як захист від збільшеного коду
- encodedByte <<= codeLength; // зсуваємо вже записане, зправа з'являється місце (біти) для нового коду
- encodedByte |= code; // записуємо поточний код на місце (пусті молодші біти) що з'явилося після зсуву
- writedBitCount += codeLength; // лічильник записаних бітів збільшуємо на розмір записаного (довж.коду)
- // System.out.println("binary encodedByte: " + Integer.toBinaryString(encodedByte));
- // System.out.println("writedBitCount: " + writedBitCount);
- // якщо назбирали зжатий байт
- if (writedBitCount >= Byte.SIZE) {
- writedBitCount -= 8;
- int overWrited = encodedByte & ((int) Math.pow(2, writedBitCount) - 1); // коли записали більше восьми біт то забираємо
- // їх (вони молодші - справа) вирахованою хитрою маскою
- encodedByte >>= writedBitCount; // та повертаємось зсувом до 8 бітів
- System.out.println("ready for use encoded byte: " + (encodedByte & 255));
- encodedByte = overWrited; // а ті зайві (перезаписані) переносимо до наступного
- }
- // flush - коли цикл фактично скінчився, але останній байт не повністю сформований, або в акурат сформований
- // та не встигне повернутися (в нашому випадку вивестися до терміналу)
- if ((i == codes.length - 1) && writedBitCount != 0) {
- System.out.println("ready for use encoded byte: " + ((encodedByte & 255) << (8 - writedBitCount)));
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment