[JAVA][동적할당]Hamming code

stack overflow/JAVA 2013. 6. 29. 16:24 posted by Allen Park


Hamming.java

HammingTest.java







<HammingTest.java> - 메인함수


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class HammingTest {

public static void main(String[] args) throws IOException {

int parityLength = 1; //패리티 길이(예시 : 4)

int[] parityData; //패리티 값 (자동생성)

int numOfDataBits; //데이터 길이(직접 입력)

int[] data; // 데이터 값 (직접 입력)

int[] hammingData; //패리티 + 데이터 값 (자동 생성)

int hammingDataLength; //패리티 + 데이터 길이 (자동 생성)

int[][] location; //매트릭스 값 (자동 생성)

int[] enteredHamming; //비교 대상 값 (직접 입력)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

//Hamming hamming = new Hamming(); //굳이 인스턴스화 될 필요가 없음


//Data 비트 수 입력 받기

while (true) {

System.out.println("Enter number of bits : ");

String str = br.readLine();

if(str.length() == 0) {

System.out.println("Please enter an integer value over 0.");

}

else {

numOfDataBits = Integer.parseInt(str);

if(numOfDataBits < 1)

System.out.println("Please enter an integer value over 0.");

else break;

}

}

//Parity 길이 구하고 해밍코드 길이 산출하기

while(true) {

if(Math.pow(2, parityLength) >= numOfDataBits + parityLength + 1)

break;

else parityLength++;

}

hammingDataLength = numOfDataBits + parityLength;

//배열 크기 할당

data = new int[numOfDataBits];

parityData = new int[parityLength];

hammingData = new int[hammingDataLength];

enteredHamming = new int[hammingDataLength];

location = new int[parityLength][hammingDataLength];

System.out.println("Number of parity bits : " + parityLength);

System.out.println("Number of hamming bits : " + hammingDataLength);

//Data 값 입력 받고 출력

System.out.println("Enter bit number : ");

for(int i = 0; i < numOfDataBits; i++) {

while(true) {

String str = br.readLine();

if(str.length() == 0) {

System.out.println("Please enter a bit value 0 or 1.");

}

else {

data[i] = Integer.parseInt(str);

if(data[i] < 0 || data[i] > 1)

System.out.println("Please enter a bit value 0 or 1.");

else break;

}

}

}

Hamming.showDataBit(numOfDataBits, data);

Hamming.hammingArrayGeneration(data, hammingData, parityLength, hammingDataLength);

Hamming.setLocationsToZero(parityLength, hammingDataLength, location);

for(int i = 0; i < parityLength; i++)

Hamming.getLocations(i, hammingData, location, hammingDataLength);

Hamming.showMatrix(parityLength, hammingDataLength, location);

Hamming.generateParity(location, parityData, parityLength, hammingDataLength);

Hamming.showParity(parityLength, parityData);

Hamming.hammingArrayCompletion(hammingDataLength, hammingData, parityData);

Hamming.showHammingCode(hammingData, hammingDataLength);

//틀린 Hamming Data 입력받기

System.out.println("Enter hamming code of " + hammingDataLength + " bits :");

for(int i = 0; i < hammingDataLength; i++) {

while(true) {

String str = br.readLine();

if(str.length() == 0) {

System.out.println("Please enter a bit value 0 or 1.");

}

else {

enteredHamming[i] = Integer.parseInt(str);

if(enteredHamming[i] < 0 || enteredHamming[i] > 1)

System.out.println("Please enter a bit value 0 or 1.");

else break;

}

}

}

Hamming.setLocationsToZero(parityLength, hammingDataLength, location);

for(int i = 0; i < parityLength; i++)

Hamming.getLocations(i, enteredHamming, location, hammingDataLength);

Hamming.generateParity(location, parityData, parityLength, hammingDataLength);

Hamming.errorCalculate(enteredHamming, parityData, parityLength, hammingDataLength);

Hamming.showHammingCode(enteredHamming, hammingDataLength);

}

}




<Hamming.java>

public class Hamming {

static void hammingArrayGeneration(int data[], int hammingData[], int parityLength, int hammingDataLength) {

for(int i = 0; i < hammingDataLength; i++) {

hammingData[i] = 3; //초기화를 제 3의 수로 함

}

for(int i = 0; i < parityLength; i++) {

int cur = (int)Math.pow(2, i) - 1;

hammingData[cur] = 2; //패리티 비트가 들어갈 자리를 값 2로 미리 마킹함

}

for(int i = 0; i < hammingDataLength; i++) {

for(int j = 0; j < hammingDataLength; j++) {

if(hammingData[j] == 3) {

hammingData[j] = data[i]; //2로 마킹되지 않은 데이터 비트 자리에 data 배열의 값들을 채워 넣음

break;

}

else continue;

}

}

}

static void hammingArrayCompletion(int hammingDataLength, int[] hammingData, int[] parityData) {

int order_parity = 0;

for(int i = 0; i < hammingDataLength; i++) {

if(hammingData[i] == 2) {

hammingData[i] = parityData[order_parity++];

}

}

}

static void setLocationsToZero(int parityLength, int hammingDataLength, int[][] location) {

for(int i = 0; i < parityLength; i++) {

for(int j = 0; j < hammingDataLength; j++) {

location[i][j] = 0;

}

}

}

static void getLocations(int i, int hammingData[], int location[][], int hammingDataLength) {

int step = (int) Math.pow(2, i); //int step : 탐지 범위와 탐지 배제 범위 역할을 동시에 하는 변수

int cur = step - 1; ////변수 cur은 hammingData 배열 위를 돌아다니는 지시자 같은 역할을 하도록 고안함

for(int cur_inner = cur; cur_inner < hammingDataLength;) {

for(int j = 0; j < step; j++) {

if(cur_inner > hammingDataLength - 1) break;

if(hammingData[cur_inner] == 1) {

location[i][cur_inner] = 1;

}

cur_inner++;

}

cur_inner += step;

}

}

static void generateParity(int location[][], int parityData[], int parityLength, int hammingDataLength) {

for(int i = 0; i < parityLength; i++) {

int cnt = 0;

for(int j = 0; j < hammingDataLength; j++) {

if(location[i][j] == 1) {

cnt++;

}

} //System.out.println(i + "번째 cnt : " + cnt);

if(cnt % 2 == 1) { //짝수 패리티를 맞추기 위한 조건문

parityData[i] = 1;

}

else {

parityData[i] = 0;

}

cnt = 0;

}

}

static void errorCalculate(int enteredHamming[], int parityData[], int parityLength, int hammingDataLength) {

int error_total = 0;

for(int i = parityLength - 1; i > -1; i--) {

if(parityData[i] == 1) {

error_total += (int)(Math.pow(2, i)); //2진수인 값들을 10진수로 취합한다

}

}

System.out.println("The " + error_total + " bit is wrongly received\n");

if(enteredHamming[error_total - 1] == 1) { //고쳐야 할 비트가 1일 경우 0으로 0일 경우 1로 정정한다

enteredHamming[error_total - 1] = 0;

}

else {

enteredHamming[error_total - 1] = 1;

}

System.out.println("The correct hamming code is");

}


//////////////////////////////출력함수//////////////////////////////

static void showHammingCode(int hammingData[], int hammingDataLength) { //오류를 수정하고 난 해밍 코드 출력에도 이 함수를 씀

System.out.println("HAMMING CODE ARRAY : ");

for(int i = 0; i < hammingDataLength; i++) {

System.out.print(hammingData[i]);

} System.out.println("\n");

}

static void showDataBit(int numOfDataBits, int[] data) {

System.out.println("Data bits are : ");

for(int i = 0; i < numOfDataBits; i++)

System.out.print(data[i]);

System.out.println("\n");

}

static void showMatrix(int parityLength, int hammingDataLength, int[][] location) {

System.out.println("Location is :");

for(int i = 0; i < parityLength; i++) {

for(int j = 0; j < hammingDataLength; j++) {

System.out.print(location[i][j] + " ");

}

System.out.println();

} System.out.println("");

}

static void showParity(int parityLength, int[] parityData) {

System.out.println("Even Parity : ");

for(int i = 0; i < parityLength; i++) {

System.out.print(parityData[i] + " ");

} System.out.println("\n");

}

}