给定二进制消息和奇偶校验位数,生成相关的奇偶校验位。
奇偶校验位是一种简单的错误检测形式。它是通过计算消息中1's的数量来生成的,如果它甚至在末尾附加了一个0,如果它是奇数附加1。
那样的话,如果有一个1位错误,3位错误,5位错误,.在消息中,由于奇偶校验位,您知道消息已被更改。
虽然如果修改了偶数位,但奇偶校验保持不变,因此您将不知道消息是否已被更改。
只有50%的时间,你会知道,如果比特已经改变了一个奇偶位。
要为给定的二进制消息生成n奇偶校验位,请执行以下操作:
1's的号码例如,使用三个奇偶校验位(n=3)和消息10110111110110111:
10110111110110111 -> 13 1's10110111110110111附5(二进制) -> 10110111110110111101最后三位数字充当奇偶位。
奇偶校验位的优点是,只有在修改了多个2^n位(忽略共享相同排列的消息)时,它们才能检测错误。使用三个奇偶校验位,当8、16、24、32、40、.比特已经被改变了。
当你知道什么时候位被改变的时候,比仅仅使用一个奇偶校验位要多得多。
0<n,奇偶位数)作为输入。n奇偶位的二进制字符串/二进制数组n。[In]: 10110, 1
[Out]: 101101
[In]: 0110101, 2
[Out]: 011010100
[In]: 1011101110, 3
[Out]: 1011101110111
[In]: 0011001100111101111010011111, 4
[Out]: 00110011001111011110100111110010发布于 2022-10-03 18:26:38
发布于 2022-10-03 19:14:55
[ dup bin> bit-count pick 2^ mod >bin rot 48 pad-head append ]接受输入作为n msg。
! 3 "10110111110110111"
dup ! 3 "10110111110110111" "10110111110110111"
bin> ! 3 "10110111110110111" 94135
bit-count ! 3 "10110111110110111" 13
pick ! 3 "10110111110110111" 13 3
2^ ! 3 "10110111110110111" 13 8
mod ! 3 "10110111110110111" 5
>bin ! 3 "10110111110110111" "101"
rot ! "10110111110110111" "101" 3
48 ! "10110111110110111" "101" 3 48
pad-head ! "10110111110110111" "101"
append ! "10110111110110111101"发布于 2022-10-03 12:21:37
期望(binary_string)(n)并返回另一个二进制字符串。
s=>g=(n,k)=>k^n?g(n,-~k)+(~-s.split`1`.length>>k&1):s从右到左构建输出要容易一些。这样,我们就可以在最后一次递归调用中追加输入字符串。
s => // outer function taking the binary string s
g = (n, // inner recursive function taking n
k) => // and a counter k which is initially undefined
k ^ n ? // if k is not equal to n:
g(n, -~k) + // do a recursive call with k + 1
( // append one binary digit:
~-s.split`1` // to get the number of 1's, subtract 1 from the length
.length // of the array obtained by splitting the input on 1's
>> k & 1 // right shift by k positions and keep the LSB
) //
: // else:
s // append s and stop the recursionhttps://codegolf.stackexchange.com/questions/252491
复制相似问题