#include "encoder.h"
#include "encoderlib.h"
/**
* M[i] 8-bitlik bir sayıdır. Bunu 2-şer bitlik 4 parçaya böleceğiz.
* Her parça için bir "kova" (bucket) tanımlıyoruz.
* Kova ID = (Parça Sırası << 6) | Mesaj İndeksi
*/
void encode(int N, int M[]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < 4; j++) {
// j-inci 2-bitlik parçayı al (0, 1, 2 veya 3)
int val = (M[i] >> (j * 2)) & 3;
// Papağana öğreteceğimiz sayı (0-255 aralığında)
// İlk 2 bit j (parça no), kalan 6 bit i (indeks)
int parrot_val = (j << 6) | i;
// Veri değeri (val) kadar papağan gönder
// Eğer val=0 ise hiç papağan gitmez (verimlilik sağlar)
for (int k = 0; k < val; k++) {
send(parrot_val);
}
}
}
}
#include "decoder.h"
#include "decoderlib.h"
/**
* Alınan papağanların değerlerini sayarak frekans tablosu oluşturur.
* Her i indeksi için 4 parçayı birleştirerek orijinal sayıyı üretir.
*/
void decode(int N, int L, int X[]) {
// 0-255 arası hangi papağandan kaç tane geldiğini tutan dizi
static int counts[256];
// Diziyi temizle (Statik olduğu için her çağrıda sıfırlanmalı)
for (int i = 0; i < 256; i++) counts[i] = 0;
// Gelen tüm papağanları say
for (int i = 0; i < L; i++) {
counts[X[i]]++;
}
// Her mesaj indeksi için parçaları topla
for (int i = 0; i < N; i++) {
int original_byte = 0;
for (int j = 0; j < 4; j++) {
// Kova ID'sini tekrar oluştur
int parrot_val = (j << 6) | i;
// Bu kovadaki papağan sayısı, orijinal 2-bitlik veridir
int val = counts[parrot_val];
// Bitleri doğru konuma yerleştir
original_byte |= (val << (j * 2));
}
output(original_byte);
}
}