在凯撒密码编码中包装字符
Wrapping chars in caesar cipher encode
谁能解释一下 Caesar 移位代码中 a-to-z 和 A-to-Z 之间的字符换行是如何发生的?
k %= 26;
for(int i = 0; i < n; i++){
int c = s[i];
if(c >= 'a' && c <= 'z'){
c += k;
if( c > 'z'){
c = 96 + (c % 122); // wrapping from z to a?
}
}
else if(c >= 'A' && c <= 'Z'){
c += k;
if(c > 'Z'){
c = 64 + (c % 90);
}
}
cout << (char)c;
}
K 是移位量,c 是字符串 s 的一个字符。
有没有更好的方法来做到这一点?
让我们对代码进行一些更改,这样可以更容易地看到发生了什么
for(int i = 0; i < n; i++){
int c = s[i];
if(c >= 'a' && c <= 'z'){
c += k;
if( c > 'z'){
c = 'a' + (c % 'z') - 1; // wrapping from z to a?
}
}
else if(c >= 'A' && c <= 'Z'){
c += k;
if(c > 'Z'){
c = 'A' + (c % 'Z') - 1;
}
}
cout << (char)c;
}
所以在 c = 'a' + (c % 'z') - 1;
中如果 c
大于 z
那么我们 mod c
通过 z
(122) 得到如何我们需要离开 a
中的许多角色。同样的事情也发生在大写字母上。我在这里减去一个,因为我们从 a
开始,而不是像原始代码那样从 a
之前的字符开始。
谁能解释一下 Caesar 移位代码中 a-to-z 和 A-to-Z 之间的字符换行是如何发生的?
k %= 26;
for(int i = 0; i < n; i++){
int c = s[i];
if(c >= 'a' && c <= 'z'){
c += k;
if( c > 'z'){
c = 96 + (c % 122); // wrapping from z to a?
}
}
else if(c >= 'A' && c <= 'Z'){
c += k;
if(c > 'Z'){
c = 64 + (c % 90);
}
}
cout << (char)c;
}
K 是移位量,c 是字符串 s 的一个字符。
有没有更好的方法来做到这一点?
让我们对代码进行一些更改,这样可以更容易地看到发生了什么
for(int i = 0; i < n; i++){
int c = s[i];
if(c >= 'a' && c <= 'z'){
c += k;
if( c > 'z'){
c = 'a' + (c % 'z') - 1; // wrapping from z to a?
}
}
else if(c >= 'A' && c <= 'Z'){
c += k;
if(c > 'Z'){
c = 'A' + (c % 'Z') - 1;
}
}
cout << (char)c;
}
所以在 c = 'a' + (c % 'z') - 1;
中如果 c
大于 z
那么我们 mod c
通过 z
(122) 得到如何我们需要离开 a
中的许多角色。同样的事情也发生在大写字母上。我在这里减去一个,因为我们从 a
开始,而不是像原始代码那样从 a
之前的字符开始。