我正在尝试对ASCII字母字符进行换行,以执行从键的转换。例如,如果键为2,则将字母A
更改为C
。但是,如何使用模数算法环绕Z
才能到达B
?
我正在尝试实现以下公式:
ci = (pi + key) % 26;
其中ci
是第i
个加密字母,而pi
是要加密的第i
个字母。
答案 0 :(得分:2)
我相信您需要使用“相对”值,而不是绝对值。
使用类似
ci = ((pi - 'A' + key) % 26 ) + 'A';
字符整数常量存储编码的值,在这种情况下为ASCII。在这里,'A'
从一个偏移量(十进制值65)开始,而不是从0开始。因此,在使用% 26
操作对结果进行包装之前,您需要获取抵消了。计算完成后,将偏移量加回去以获取正确的ASCII表示形式。
答案 1 :(得分:2)
其他人已经显示了减去ASCII字母偏移量的基本概念,但是在从大写字母到非大写字母过渡时,您必须要小心,因为我猜想要避免在其中使用一些符号。我添加了一些逻辑,可以使负移位,并将字母保持在大写字母或非大写字母的空间内,并测试它是否是字母。
# Let's suppose that I want the ID: 17J965 and the big data.frame is call `big_df.txt`
big_df <- read.delim("big_df.txt")
sample <- grep("17J965", test2a$GATK_Illumina.samples)
df_sample <- big_df[sample,]
# df_sample has all the rows containing 17J965, but now I want to create the new data.frame with the extra columns and only select the correct values if there are more IDs
答案 2 :(得分:0)
更深
ci = ((pi - 'A' + key) % 26) + 'A';
当key
为非负数且不太大时,由@Sourav Ghosh回答的会生成预期的编码A-Z。它将pi
减少为- 'A'
,因此该值在[0...25]
范围内,并在%
计算后重新偏移。
要在int
的完整 key
范围内工作,需要花费更多的代码。
以key
和[INT_MIN...INT_MAX]
的等效功能范围缩小[-25 ... 25]
范围key % 26
。此步骤对于防止int
溢出pi - 'A' + key
很重要。如果许多字母需要编码,则可以执行一次。
添加26。这确保将负键移到正键。
ci = ((pi - 'A' + key%26 + 26) % 26 ) + 'A';
注意:在C语言中,%
不是 mod 运算符,而是 remainder 运算符。当a%b
和/或a
为负时,b
会发生功能差异。 ref