<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");
}
}