【发布时间】:2025-11-29 16:35:02
【问题描述】:
我正在尝试解决一个问题,即在不使用 java 中长数字的二进制字符串的情况下找到汉明码。
我不明白我们怎么能做到这一点,我搜索了很多地方,比如*的解释和this one I found online,但它们都需要二进制字符串才能使用,但在这种情况下我不能使用它们.
我有一个代表输入二进制的长数字,现在我需要找到汉明码。
据我了解,我可以在该二进制文件中的位置 1、2、8 ... 处放置空白位置。现在我可以使用布尔值将 0 或 1 放在那个位置,该布尔值告诉我这是偶数还是奇数。
我使用字符串和列表编写了一个代码,但我需要不使用字符串或列表。
String text = new Scanner(System.in).next() ;
int len = text.length() ;
ArrayList codearray = new ArrayList() ;
ArrayList pos_arr = new ArrayList() ;
while (!(len + r + 1 <= Math.pow(2, r))) {
r++;
}
System.out.println("Number of parity bits : "+r);
for (int i=0 ; i<len + r ; i++) {
if (IsPowerTwo(i+1) ){
codearray.add("?") ;
}else {
codearray.add(text.charAt(j));
j++ ;
}
}
System.out.println(codearray.toString());
//to determine the position of parity bits
for (int i=0 ; i< codearray.size() ; i++) {
if (codearray.get(i) == "?") {
int k ,s=1;
// For Debugging.
//System.out.println("Calculate at position " + (i+1) ) ;
for (k = i ; k < codearray.size() ; k++){
if (i==0) {
k++ ;
pos_arr.add(k);
}else {
pos_arr.add(k+1);
if(s % (i+1) == 0) {
k += i+1 ;
}
}
s++ ;
}
checkOnes(pos_arr,codearray,i) ;
pos_arr.clear();
}
}
System.out.println("Code word: ");
Arr_to_Str(codearray) ;
}
public static boolean IsPowerTwo(int num){
int checked = num & num -1 ;
if (checked == 0 ){
return true ;
}else {
return false ;
}
}
public static void checkOnes(ArrayList array, ArrayList codearray, int position ){
int count =0;
for (int i=0 ; i < array.size(); i++) {
int index = (int) array.get(i) -1 ;
if (codearray.get(index) == "?" ) {
codearray.set(index,0) ;
}
int num = Integer.parseInt(codearray.get(index).toString()) ;
if (num == 1 ) {
count++ ;
}
if(count % 2 ==0 ){
codearray.set(position, 0) ;
}else {
codearray.set(position, 1) ;
}
}
}
public static void Arr_to_Str(ArrayList array){
for (int i=0;i<array.size();i++){
System.out.print(array.get(i));
}
}
但这需要我处理二进制字符串或列表,我如何处理长数字,比如 210。
我对位操作真的很陌生,因此我无法解决这个问题。非常感谢任何帮助。
【问题讨论】:
-
能否添加一些示例代码?
-
为什么需要使用列表/字符串?您可以使用按位运算:tutorialspoint.com/java/java_basic_operators.htm 例如,
x & ~4将使右边的第三位为零。 -
@WillemVanOnsem 我是这样的位操作新手,你能解释一下我怎样才能对汉明码做同样的事情。
-
@Jeremy那我不理解上面不用字符串的算法,所以想不出代码。
-
请展示您的尝试,任何尝试。检查链接,试一试,如果仍然卡住,请返回。我们确实欢迎初学者来到这里,但我们希望在这个问题中看到一些真正努力的具体证据。
标签: java algorithm bit-manipulation parity hamming-code