这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
题目描述
难度:简单
使用异或对字符进行加密和解密。
如对“十点进攻”进行加密。
密码本为
secret='8'
加密方式:异或
知识点
- 位运算
解题思路
Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
拿左移举个例子,讲解计算过程。
public class Test {
public static void main(String[] args) {
System.out.println(5<<2);//运行结果是20
}
}
// 输出 20
程序是怎样执行的呢? 首先会将5转为2进制表示形式(java中,整数默认就是int类型,也就是32位):
0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:
0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
再演示一下题目中的异或:
位异或:第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
public class Test {
public static void main(String[] args) {
System.out.println(5 ^ 3);
}
}
//输出 6
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
6转换为二进制:0000 0000 0000 0000 0000 0000 0000 0110
代码实现
/**
* 使用异或对字符进行加密和解密
*/
public class question_15 {
public static void main(String args[]){
char a1='十',a2='点',a3='进',a4='攻';
char secret='8';
a1=(char)(a1^secret);
a2=(char)(a2^secret);
a3=(char)(a3^secret);
a4=(char)(a4^secret);
System.out.println("密文:"+a1+a2+a3+a4);
a1=(char)(a1^secret);
a2=(char)(a2^secret);
a3=(char)(a3^secret);
a4=(char)(a4^secret);
System.out.println("原文:"+a1+a2+a3+a4);
}
}
输出结果
扩展总结
位运算在有些时候会带非常神奇的效果,而且因为计算机是二进制的原因,位运算的速度也会快一些,需要熟练掌握。
最后
独脚难行,孤掌难鸣,一个人的力量终究是有限的,一个人的旅途也注定是孤独的。当你定好计划,怀着满腔热血准备出发的时候,一定要找个伙伴,和唐僧西天取经一样,师徒四人团结一心才能通过九九八十一难。 所以,
如果你想学好Java
想进大厂
想拿高薪
想有一群志同道合的伙伴
请加入点击我的主页