今晚,要初步学会异或运算。 1、概念:(相同为0,不同为1,可以和物理中的非门一起理解) 异或,英文为exclusive OR,缩写成xor,异或(xor)是一个数学运算符。它应用于逻辑运算。 数学符号:”“⊕”,计算机符号为“xor”。 运算法则: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),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。 略称:XOR、EOR、EX-OR 程序中有三种演算子:XOR、xor、⊕。 使用方法: z = x ⊕ y z = x xor y 2、运算法则:
void Swap(int *a,int *b){ a=a^b; b=a^b; a=a^b;}
先介绍这么多,等发现了新的内容再来更新。 3.例题 问题 E: 回忆与困惑 时间限制: 1 Sec 内存限制: 128 MB
题目描述 小学校里的欢声和校园里的花都溶解在静沉沉地夜气里。那种声音实在可见可触,可以供诸瓶儿,一簇又一簇。我听见钟声,像一个比喻,我没有数,但我知道他的急徐、轻重,我听出今天是西南风。 西南风?这个仿佛有点陌生又总是在那边的词语使我沉寂了下来。它使我想到了一个困惑,一个以前的已经解决,却还是有点淡淡的神秘的困惑。 我记得,当时是在西南方行进的远离故乡的火车上,遇到了这个兔子一般神秘的问题 这是一个跳跃的数列。经过长时间的观察,我发现这个数列的前面几项是这样的:1,1,2,3,5,8,13… 我发现,无论何时这个数列出现,他的前两项都是1,后面的数字都会看一眼前面的数字,把他前面的两项的值的和作为自己的值。 我记得,当时我想知道这个数列的第n项是什么。但是我不喜欢太大的数字,所以我困惑的n一定是一个小于等于64的正整数。也就是说,如果n不是正整数,或者n严格大于了64,那么它就不符合我的要求。现在,我仿佛回忆起了自己当时的询问,并希望请你一一回答。因为时间长了,记忆有点模糊,可能会有询问不符合我的要求,这时候你应该告诉我pcftxdy。(具体输出方式请按照输出格式中的描述来) 输入 第一行,一个正整数num表示子任务编号(Num=0表示这是样例数据) 第一行,一个整数T。 接下来T行,每行一个数ni表示第i组询问的n。 输出 由于输出可能太多,你只要输出不合法的询问的个数cnt和其他询问的异或和ans即可。 如果询问全都不合法,令ans=0 两个数中间用一个空格分隔。 样例输入
050123123456
样例输出
2 2
提示 对于第一组询问,n不在czyarl关心的范围内,不合法謻 对于第二组询问,n在czyarl关心的范围内,答案为1; 对于第三组询问,n在czyarl关心的范围内,答案为1; 对于第四组询问,n在czyarl关心的范围内,答案为2; 对于第五组询问,n大于了64,不合法; 最后不合法的询问有2个,cnt=2 ans=1 异或 1 异或 2 = 2
对于所有数据,n在int范围内,T≤106
#include #include #include #include #include #include #include #include #include #define ll long long#define inf 0x3f3f3f3f//#define localusing namespace std;const int N = 1e6+5;ll f[70]= { 0},ilg=0;ll ans=0;ll a,b[N];void fib(){ f[1]=1; f[2]=1; for(int i=3; i<=64; i++) f[i]=f[i-1]+f[i-2];}int main(){ #ifdef local freopen("input.txt","r",stdin);#endif // local fib(); int num,t,n,s=0; scanf("%d%d", for(int i=0; i
参考:百度词条之异或。
【文章出处:香港站群服务器 http://www.558idc.com/hkzq.html 复制请保留原URL】