32 ビット ワードを 40 ビット ワードにエンコードする SECEncoder を scala で作成するタスクが割り当てられました。40 ビット ワードの最下位桁は 32 ビット ワードです。
SECDecoder は、最大で 1 ビット エラーがあったとしても、同じ 32 ビット ワードを返すことができる必要があります。
これまでのところ、エンコーダーは単純なパリティ ビットをチェックしてワードに追加できますが、デコーダーから 32 ビット ワードを正しく取得できないため、デコーダーに行き詰まっています。
val p = Vector(0x55555555L, 0x33333333L, 0x471C71C7L, 0x0F0F0F0FL, 0x41F07C1FL, 0x3F03F03FL, 0x701FC07FL, 0x00FF00FFL)
def ham(j: Int, m: Int) = ((0 to 31).map(i => (((m & p(j-1)) >> i)&1)).sum) % 2
def SECEncode(d: Int): Long = {
val ps = Vector(ham(1, d), ham(2, d), ham(3, d), ham(4, d), ham(5, d), ham(6, d), ham(7, d), ham(8, d))
// calculates the value of the parity bits
var dN = d.toLong
for (i <- 0 to 7) {
dN += (ps(i) << (31.toLong + i.toLong))
}
dN
}
def SECDecode(s: Long): Int = {
val d = (s & Int.MaxValue).toInt // takes the 32 least significant bits of _s_
val check = (s >>> 31) ^ (SECEncode(d) >>> 31) // checks which bits in the encoding differ
import scala.collection.mutable.Buffer
val buf1 = Buffer[Long]()
val buf2 = Buffer[Long]()
for (i <- 0 to 7) {
if (((check >>> i)&1) == 1) buf1 += p(i) else buf2 += p(i)
}
val b = buf1.reduce(_ ^ _) | buf2.reduce(_ | _)
(((b ^ Int.MaxValue)) ^ d).toInt
}
だから私が本質的にやろうとしているのは、32ビットワードに追加されたビットがパリティビットであるハミングに似た原理を通してパリティビットを計算することです.
デコーダーでは、指定された単語のパリティ ビットとエンコードされた指定された単語のパリティ ビットの違いをチェックして、どのパリティが異なるかを確認します。
私が立ち往生しているのは、どのビットが32ビットワード全体と異なっているかを正確に計算してから変更する方法です? 私がそれをやろうとすると、いくつかのビットが出てきましたが、正確なものは得られません。
私は完全に間違った方向に進んでいますか、それとも何かが欠けているだけですか?