今晚,要初步学会异或运算。
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、运算法则:

  1. a ⊕ a = 0
  2. a ⊕ b = b ⊕ a
  3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
  4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
  5. a ⊕ b ⊕ a = b
  6. 若x是二进制数0101,y是二进制数1011;
    则x⊕y=1110
    只有在两个比较的位不同时其结果是1,否则结果为0
    即“两个输入相同时为0,不同则为1”。

    在计算机中普遍运用,异或(xor)的逻辑符号一般用xor,也有用⊕的。
    C语言: " ^ "
    C++:" ^ " 或者 xor
    打个例子:
    C语言中交换两个数,一般采用中间变量、和的关系,下面来介绍一下用异或怎么交换两个数。
    原理:5. a ⊕ b ⊕ a = b
    同一变量与|另一变量和其的异或值|异或等于另一个变量,如(a^ b)^b=a。(注意断句qwq)
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
两个数中间用一个空格分隔。
样例输入

0
5
0
1
2
3
123456

样例输出

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 <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <ctime>
#define ll long long
#define inf 0x3f3f3f3f
//#define local
using 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",&num,&t);
    for(int i=0; i<t; i++)
    {
        scanf("%d",&a);
        if(a<=0||a>64)
            ilg++;
        else
            b[s++]=f[a];
    }
//    for(int i=1;i<=64;i++)
//        printf("%lld\n",f[i]);
    if(ilg==t)
    {
        printf("%d 0",ilg);
        return 0;
    }
    for(int i=0; i<s; i++)
        ans^=b[i];;
    printf("%lld %lld",ilg,ans);
    return 0;
}

感悟:不开ll见祖宗啊!!

参考:百度词条之异或。