我正在尝试解决一个问题,该问题归结为在不使用java中长数的二进制字符串的情况下找到锤子代码。
我不明白我们如何做到这一点,我在Wikipedia解释等许多地方都搜索过,我在网上找到了这一点,但是所有这些都需要二进制字符串来使用,但是在这种情况下,我无法使用它们。
我有一个代表输入二进制的长数,现在我需要找到锤码。
据我了解,我可以在那个二进制的位置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的长号码。
我真的是一个陌生的操纵,因此我无法将其缠住。我真的很感谢任何帮助。
可以通过位操作实现锤式编码。使用字符串可能更简单。以下是有关实施的一些想法。
编码算法的锤子概述是以下
input_val is a long int to encode
output_val_is the long int result
for s in 0..5
count number of bits in input_val whose position has bit s set
add to output_val the parity of this count
add next 2^s bits from input_val to output_val
确实有两个问题:获得一组特定位的奇偶校验并用位移动创建输出。
在给定模式上计数设置位*
对于锤式编码,必须在位(模式(子集上计算奇偶校验。模式为01010101011 ... 01对于第一步,001100110 ... 00110的第二步等,可以在由步骤编号的数组mask
中编码。mask [0] = 0x5555555555555555,蒙版[1] = 0x666666666666666666666,mask [2] = 0xf0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0,mask [3]
为了获得这种奇偶校验,更简单的是计算位数并获得该计数的LSB。Java中有一个函数,可以在整数中提供数量。因此,这里唯一需要的操作是
count=Integer.bitcount(input_val & masks[s]) ;
其中s是计算阶段编号。
然后,您必须添加到输出count & 0x1
才能添加计数的奇偶校验。
在整数
添加一点它与输入和输出值大小的位数密切相关。为了简单起见,我认为您的两个数据都可以在64位编码。这意味着您有6个奇偶校验位,并且输入数据仅是变量的一部分,并且Input_data的6 msb为零。
要将整数v
的LSB添加到output_val
中,更简单的是在结果的MSB位置添加它,然后将其正确移动。添加了64位后,一切都位于其适当的位置。请注意,必须对output_val进行未签名,以避免正确的算术偏移。
因此,要将V的LSB添加到output_val,要执行的操作是
output_val = (output_val >> 1) | (v<< 63);
v&lt; 63提取LSB并将其放在MSB位置。OR添加到移位的结果中。
要添加几个位(例如K(,可以使用
output_val = (output_val >> k) | (v<< (64-k));
因此,最终实施(改进(将是
input_queue = input_val;
output_val = 0;
for (s=0; s<6;s++) {'
count=Integer.bitcount(input_val & masks[s]) ; // compute parity
output_val = (output_val >> 1) | (count << 63);// add parity to output
output_val = (output_val >> (1<<s)) | (input_queue << (64-(1<<s));
// add 2^s LSB of input to output
input_queue >>=(1<<s); // suppress 2^s bits form input_queue
}