异或加密
本文只介绍这一种加密。
异或是什么
百度有最好的解答
百度解答
异或
异或,英文为exclusive OR,缩写成xor
异或(eor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“eor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
但是…
这些都没用!(欠揍.jpg)
我们只需要这些:
自反:a ⊕ b ⊕ a = b
编程知识
语言
Java是最流行的语言,
但是…
我不会(调皮.jpg)
所以本文用的语言是古董级的语言:
无敌的C++
bitset头文件
#include<bitset>
是什么
bitset头文件中装着bitset这个强大的类,其作用呢
就是二进制数的容器。
为什么用
int类型本身是不支持异或的,但bitset是支持的,所以我们抛弃了int, 使用了bitset。
怎么用
请移步百度 :
百度介绍bitset
bitset声明及操作
用整值类型表示位向量的问题在于:使用位操作符来设置复位和测试单独的位层次比较低也比较复杂.
例如:用整值类型将第27 位设置为1, 我们这样写
quiz1 |= 1<<27;
而用bitset 来做我们可以写
quizl[ 27 ] = 1;
或
quiz1.set( 27 );
要使用bitset 类我们必须包含相关的头文件
#include <bitset>
声明1:
bitset 有三种声明方式。在缺省定义中,我们只需简单地指明位向量的长度。例如:
bitset< 32 > bitvec;
声明了一个含有32 个位的bitset,对象位的顺序从0 到31。缺省情况下所有的位都被初始化为0 。
相关函数:
1.any():
为了测试bitset 对象是否含有被设置为1的位,我们可以使用any()操作
当bitset对象的一位或多个位被设置为1 时any()返回true
例如,对于bitvec ,如下测试
bool is_set = bitvec.any();
它的结果当然是false。
2.none():
相反,如果bitset 对象的所有位都被设置为0 ,则none()操作返回true
例如,对于bitvec 测试
bool is_not_set = bitvec.none();
结果为true
3.count():
count()操作返回被设置为1的位的个数.
int bits_set = bitvec.count();
4.set():
我们可以用set()操作或者下标操作符来设置某个单独的位
例如,下面的for循环把下标为偶数的设置为1.
for ( int index = 0; index < 32; ++ index )
if ( index % 2 == 0 )
bitvec[ index ] = 1;
5.test():
类似地,测试某个单独的位是否为1 也有两种方式
test()操作。用位置做参数,返回true或false 例如:
if ( bitvec.test( 0 ))// 我们的bitvec[0] 可以工作了!
同样地,我们也可以用下标操作符
cout << "bitvec: positions turned on:\n\t";
for ( int index = 0; index < 32; ++index )
if ( bitvec[ index ] )cout << index << " ";
cout << endl;
6.reset():
要将某个单独的位设置为0 ,我们可以用reset()或下标操作符
下列两个操作都将bitvec的第一位设为0.
// 两者等价都把第一位设置为0
bitvec.reset( 0 );
bitvec[ 0 ] = 0;
我们也可以用set()和reset()操作将整个bitset 对象的所有位设为1 或0 ,只要调用相应的操作而不必传递位置参数,我们就可以做到这一点.例如
// 把所有的位设置为0
bitvec.reset();
if ( bitvec.none() != true )
// 喔! 错了
// 把所有的位设置为1if ( bitvec.any() != true )
// 喔! 又错了
7.flip():
flip()操作翻转整个bitset 对象或一个独立的位
bitvec.flip( 0 ); // 翻转第一位
bitvec[0].flip(); // 也是翻转第一位
bitvec.flip(); // 翻转所有的位的值
构造方法2,3:
还有两种方法可以构造bitset 对象,它们都提供了将某位初始化为1 的方式:
一种方法是为构造函数显式地提供一个无符号参数。bitset 对象的前N 位被初始化为参数的相应位值,例如:
bitset< 32 > bitvec2( 0xffff );
将bitvec2 的低16 位设为1
下面的bitvec3 的定义
bitset< 32 > bitvec3( 012 );
将第1 和3 位的值设置为1 假设位置从0 开0