精华内容
下载资源
问答
  • 2021-05-25 05:11:29

    异或运算是位运算,不产生进位,也不会对其他bit产生影响。一般用XOR表示,在C语言中,异或用‘^‘表示。

    异或运算法则与无进位的二进制加法一致:0^0=0,1^0=1,0^1=1,1^1=0(同为0,异为1)

    对任意元素a, 令其二进制位第k位为a[k],

    真值表:

    a[k]

    b[k]

    XOR

    0

    0

    0

    0

    1

    1

    1

    0

    1

    1

    1

    0

    异或运算有如下规律:

    1) 交换律 a ^ b = b ^ a

    由真值表, 对任意k,有a[k] ^ b[k] = b[k] ^ a[k]。因为异或不对其他位产生影响,可得a ^ b = b ^ a。

    2) 恒等律 a ^ 0 = a

    同上

    3) 归零律 a ^ a = 0

    同上

    4) 结合律 (a ^ b) ^ c = a ^ (b ^ c)

    第一种方法,列出a[k],b[k], c[k] 和 (a[k] ^ b[k]) ^ c[k] = a[k] ^ (b[k] ^ c[k])真值表即可。

    第二种方法,由异或基本性质:a[k] ^ b[k] = (a[k] + b[k]) % 2

    (a[k] ^ b[k]) ^ c[k] = ((a[k] + b[k]) % 2 + c[k]) % 2 = (a[k] + b[k] + c[k]) % 2

    同理,a[k] ^ (b[k] ^ c[k]) = (a[k] + b[k] + c[k]) % 2, 得证。

    简单应用:原地交换两个数:

    a = a ^ b

    b = a ^ b

    a = a ^ b

    假设原来的a, b 表示为ak, bk

    第一步:a = ak ^ bk

    第二步:b = a ^ bk = (ak ^ bk) ^ bk = ak ^ (bk ^ bk) = ak ^ 0 = ak

    第三步:a = a ^ b = (ak ^ bk) ^ ak = ak ^ (ak ^ bk) = (ak ^ ak) ^ bk = 0 ^ bk = bk ^ 0 = 0

    得证。

    原文:http://www.cnblogs.com/ym65536/p/4104089.html

    更多相关内容
  • 运算运算分量只能是整型或字符型数据,位运算运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果
  • 主要介绍了Java编程实现对十六进制字符串异或运算代码示例,简述了异或运算以及具体实例,具有一定借鉴价值,需要的朋友可以参考下。
  • 主要介绍了Java使用异或运算实现简单的加密解密算法实例代码,具有一定借鉴价值,需要的朋友可以参考下。
  • 可进行十六进制字符串按位异或运算,就是输入十六进制数,每个十六进制数间输入空格,然后点输出即可得到结果
  • 异或运算小工具

    2017-02-09 15:07:39
    异或运算,传入两个数据进行异或运算。得到相应的数据
  • 适合在校大学生初步实验使用,将此程序直接粘贴到Matlab的m文件中,便可直接运行,得到结果,本人已在博客中发表“与”运算实验,神经网络网址如...通过看我的博文,自己编出“异或运算代码
  • 位运算——异或运算

    2022-04-30 12:27:48
    目录按位异或运算(^)异或运算的应用镜子田地镜子 按位异或运算(^) 按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算: 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0 即相应位的值相同的,结果为 0,不...


    按位异或运算(^)

    按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
    0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
    即相应位的值相同的,结果为 0,不相同的结果为 1。
    例如,2 ^ 6结果为4
    因为2表示为二进制为0010,6表示为二进制为0110
    两数只有第三位相异,因此最后的结果为0100,即为4


    了解异或运算的用法,我们来看看异或运算在算法题中的应用。

    异或运算的应用

    镜子田地

    题目描述

    农夫约翰在屋子外面放了一些旧镜子,他的奶牛们像往常一样调皮地偷走了它们!

    奶牛们将镜子放置在了一个矩形田地中,该田地可被划分为 N × M N×M N×M个方格区域。

    在每个方格区域中,奶牛在其某对对角之间放置一个双面镜,因此,共有两种放法,一种为/放置(镜子连接方格左下角和右上角),另一种为\放置(镜子连接方格左上角和右下角)。

    一天晚上,奶牛贝茜将激光发射器带到了该田地中。

    她站在田地外面,沿着田地的行或列水平或垂直照射光束,使光束反射一定数量的镜子。

    由于镜子都是沿对角线摆放,因此经反射镜反射的水平光束最终将垂直传播,反之亦然。

    贝茜想知道从田地之外射入的水平或垂直光束最多可以在田地中被反射多少次。

    给定镜子田地的布局,请帮助贝茜计算这个数字。

    输入格式

    第一行包含 N N N M M M

    接下来 N N N行,每行包含 M M M/\字符,表示田地中镜子的具体摆放方式。

    输出格式

    输出田地之外的水平或垂直光束能够被反射的最大次数。

    如果可以无限反射,则输出 −1。

    数据范围
    1 ≤ N , M ≤ 1000 1≤N,M≤1000 1N,M1000
    输入样例:

    3 3
    /\\
    \\\
    /\/
    

    输出样例:

    3
    

    样例解释

    贝茜可以从上向下沿中间列上方发射激光。

    共可以反射 3 次。

    题目分析

    一定不会无限反射,因为这些镜子是相邻的,无限反射是需要有入口的。
    我们可以枚举从每条边射入的位置进行搜索。
    在这里插入图片描述
    我们要清楚,任意一个数a异或同一个数两次后值依旧为a,比如7^3,结果为4,4^3后,结果仍然为7。
    那么当镜子为/时,0→1、1→0、2→3、3→2。d ^= 1
    当镜子为\时,0→3、3→0、1→2、2→1。d ^= 3

    代码如下

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    const int N = 1010;
    
    int n, m;
    char g[N][N];
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    
    int dfs(int x, int y, int d)
    {
        if (x < 0 || x > n - 1 || y < 0 || y > m - 1) return 0;
    
        if (g[x][y] == '/') d ^= 1;
        else d ^= 3;
    
        return dfs(x + dx[d], y + dy[d], d) + 1;
    }
    
    int main()
    {
        cin >> n >> m;
        for (int i = 0; i < n; i ++) cin >> g[i];
    
        int res = 0;
        for (int i = 0; i < n; i ++)
        {
            res = max(res, dfs(i, 0, 1));
            res = max(res, dfs(i, m - 1, 3));
        }
    
        for (int i = 0; i < m; i ++)
        {
            res = max(res, dfs(0, i, 2));
            res = max(res, dfs(n - 1, i, 0));
        }
        cout << res << endl;
        return 0;
    }
    

    镜子

    题目描述

    农夫约翰的奶牛在农场周围造成了太多麻烦,因此约翰希望对它们保持更密切的关注。
    通过在农场的各个位置安装 N N N个反光围栏,他希望能够从 ( 0 , 0 ) (0,0) (0,0)位置的房子看到 ( a , b ) (a,b) (a,b)位置的牛棚。
    在约翰农场的二维平面图中,围栏 i i i表示为以整数位置坐标 ( x i , y i ) (x_{i},y_{i}) (xi,yi)为中心的倾斜 45 45 45度(如/\)的短线段。
    例如,以 ( 3 , 5 ) (3,5) (3,5)为中心,形如/的围栏可以描述为从 ( 2.9 , 4.9 ) (2.9,4.9) (2.9,4.9) ( 3.1 , 5.1 ) (3.1,5.1) (3.1,5.1)的线段。
    每个围栏(以及牛棚的位置)位于不同的位置。
    ( 0 , 0 ) (0,0) (0,0) ( a , b ) (a,b) (a,b)处无围栏。
    约翰计划坐在他的房屋 ( 0 , 0 ) (0,0) (0,0)处,并直接向右(沿 + x +x +x方向)看。
    当他的目光从农场的一些反光围栏上反射出来时,他希望能够看到点 ( a , b ) (a,b) (a,b)
    不幸的是,他认为其中一个反光围栏的摆放朝向不对,例如应该为/,却摆成了\
    请输出给定反光围栏中,第一个能够通过改变其朝向使得约翰成功看到点 ( a , b ) (a,b) (a,b)的围栏的顺序编号。
    如果约翰不需要切换任何围栏的朝向就已经可以看到点 ( a , b ) (a,b) (a,b)则输出 0 0 0
    如果约翰无法通过切换单个围栏的朝向使自己看到点 ( a , b ) (a,b) (a,b)则输出 − 1 −1 1

    输入格式

    第一行包含三个整数 N , a , b N,a,b N,a,b
    接下来 N N N行,其中第 i i i行描述第 i i i号围栏的位置和朝向。首先包含两个整数 x i , y i x_{i},y_{i} xi,yi表示其中心点位置,然后包含一个字符/\表示围栏朝向。
    围栏编号从 1 1 1开始。

    输出格式

    输出第一个能够通过改变其朝向使得约翰成功看到点 ( a , b ) (a,b) (a,b)的围栏的顺序编号。
    如果约翰不需要切换任何围栏的朝向就已经可以看到点 ( a , b ) (a,b) (a,b)则输出 0 0 0
    如果约翰无法通过切换单个围栏的朝向使自己看到点 ( a , b ) (a,b) (a,b)则输出 − 1 −1 1

    数据范围
    1 ≤ N ≤ 200 1≤N≤200 1N200,
    − 106 ≤ x i , y i , a , b ≤ 106 −106≤x_{i},y_{i},a,b≤106 106xi,yi,a,b106

    输入样例:

    5 6 2
    3 0 /
    0 2 /
    1 2 /
    3 2 \
    1 3 \
    

    输出样例:

    4
    

    样例解释

    农场的平面图如下所示,其中 H H H表示约翰的房子, B B B表示牛棚:

    3 .\.....
    2 //.\..B
    1 .......
    0 H../...
      0123456
    

    通过改变 ( 3 , 2 ) (3,2) (3,2)处的围栏朝向,就可以使约翰看到点 ( a , b ) (a,b) (a,b),如下所示:

    3 .\.....
    2 //./--B
    1 ...|...
    0 H--/...
      0123456
      ```
    

    题目分析

    代码如下

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    const int N = 210, INF = 1e8;
    
    int n;
    struct Mirror
    {
        int x, y;
        char c;
    }q[N];
    
    //坐标系跟镜子田地不一样
    int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
    
    void rotate(char& c)
    {
        if (c == '/') c = '\\';
        else c = '/';
    }
    
    bool check()
    {
        int d = 1, k = 0;
        for (int i = 0; i < 2 * (n + 1); i ++)
        {
            int id = -1, len = INF;
            for (int j = 1; j <= n + 1; j ++)
            {
                // 遍历每个镜子需要保证当前镜子和遍历的镜子不同
                if (k == j) continue;
                // 横竖水平 欧几里得距离 看是否能够反射到
                if (q[k].x + abs(q[k].x - q[j].x) * dx[d] != q[j].x) continue;
                if (q[k].y + abs(q[k].y - q[j].y) * dy[d] != q[j].y) continue;
                int t = abs(q[k].x - q[j].x) + abs(q[k].y - q[j].y);
                //取最小的,因为不能跨镜子反射
                if (t < len) id = j, len = t;
            }
            if (id == -1) return false;
            if (id == n + 1) return true;
            k = id;
            if (q[id].c == '/') d ^= 1;
            else d ^= 3;
        }
        return false;
    }
    
    int main()
    {
        cin >> n;
        cin >> q[n + 1].x >> q[n + 1].y;
        
        for (int i = 1; i <= n; i ++) cin >> q[i].x >> q[i].y >> q[i].c;
        
        if (check()) puts("0");
        else
        {
            for (int i = 1; i <= n; i ++)
            {
                rotate(q[i].c);
                if (check())
                {
                    cout << i << endl;
                    return 0;
                }
                rotate(q[i].c);
            }
            puts("-1");
        }
        return 0;
    }
    
    展开全文
  • “一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字?”这是经典的算法题,乍看这个题的思路特别多。
  • 异或运算常见的应用

    2022-01-27 11:16:01
    接下来将介绍异或运算的一些基础知识以及在实际中的一些应用 基础知识 异或是计算机中一种二元逻辑运算, 运算符号是 ^,它按照二进制位进行异或运算,结果为 真 或 假, 它的运算法则如下 x y x^y 0.

    “与” 运算 和 “或” 运算,大家对它们可能比较熟悉了 ,“异或” 运算 平常使用较少,存在感也不强,如果不是刻意提起,可能还想不到它

    其实,“异或” 运算也非常重要,它在加密、备份、算法等方面都有应用,每一位开发的同学都应该花点儿时间掌握它的特点和规律,以便在日常工作中能灵活的运用

    接下来将介绍异或运算的一些基础知识以及在实际中的一些应用

    基础知识

    异或是计算机中一种二元逻辑运算, 运算符号是 ^,它按照二进制位进行异或运算,结果为 真 或 假, 它的运算法则如下

    xyx^y
    000
    011
    101
    110

    表格 第一列 和 第二列 是异或运算的两个操作数,第三列是异或运算的结果,1 表示真,0 表示假

    由表格可知:如果参与运算的两个二进制位相同,则结果为 0 ,否则为 1

    也就是说,异或主要用来判断两个值是否相同

    重要的性质

    下面列出异或运算一些重要的性质,1 表示真,0 表示假, 具体的验证过程比较简单,这里就省略了

    1、一个数与自身异或,总是为 0

    x ^  x = 0
    

    2、 一个数与 0 异或,总是其自身

    x  ^  0 = x
    

    3、 交换性

    x  ^ y =  y ^ x
    

    4、 结合性

    x ^ ( y ^ z ) =  ( x ^ y )  ^ z
    

    常见应用

    异或运算本身比较简单,重点还是在应用层面,上面列出的性质,在很多方面都有应用

    • 判断两个数是否相等

    一个数与自身异或,总是为 0,我们可以使用这一点来判断两个变量是否相等

    ( a ^ b ) == 0
    

    ab相等时,表达式为真,否则为假

    • 不使用临时变量交换两个数的值

    要交换两个数的值,通常做法是借助一个临时变量,然后再进行交换,比如:tmp是临时变量,现需要交换 ab两个变量值,过程如下

    tmp = a
    a = b
    b = tmp;
    

    利用异或的一些性质,不用临时变量也能实现交换两个数的值,具体过程如下

    a  =  a  ^  b
    b  =  a  ^  b
    a  =  a  ^  b
    

    假如初始时,a = 1、b = 2

    第一个等式 a = a ^ b结果是 a = 1 ^ 2 = 3

    紧接着第二个等式 b = a ^ b结果是 b = 1 ^ 2 ^ 2 = 1 ^ 0 = 1

    最后一个等式 a = a ^ b结果是 b = 1 ^ 2 ^ 1 = 1 ^ 1 ^ 2 = 0 ^ 2 = 2

    可以看到,最终 a = 2、 b = 1,它们的值实现了交换

    上面的三条语句还可以进一步优化成一条,结果如下

    a  ^=  b  ^=  a  ^=  b
    
    • 简化表达式

    根据交换性,可以优化表达式中重复变量的异或运算,比如:表达式 a ^ b ^ c ^ a ^ b可以做如下简化

    a  ^  b  ^  c  ^  a  ^  b                   # 根据 x ^ y  = y ^ x
    
    =  ( a  ^  a )  ^  ( b  ^  b )  ^  c        # 根据 x  ^ x = 0
    
    =  0  ^  0  ^  c                            # 根据 x ^ 0 = x
    
    = c
    
    • 加密

    利用异或运算加密是很常见的加密手段,它涉及到三个变量:明文、密钥、密文,假如它们分别记为 plain_text、 encrypt_key、 cipher_text

    明文和密钥进行异或运算,可以得到密文

    plain_text  ^  encrypt_key = cipher_text
    

    密文和密钥进行异或运算,可以得到明文

    cipher_text ^ encrypt_key 
    = ( plain_text  ^  encrypt_key ) ^ encrypt_key
    = plain_text  ^ ( encrypt_key ^ encrypt_key )   # 根据 x ^ ( y ^ z ) = ( x ^ z ) ^ y
    = plain_text  ^  0                              # 根据 x ^ x = 0
    = plain_text
    
    • 备份

    根据异或的性质,异或运算还可以用于文件的备份

    现有两个文件 fileafileb,它们进行异或运算,会产生一个新的备份文件 bakfile

    bakfile  =  filea  ^  fileb
    

    根据异或的性质,可以通过 bakfilefilea得到 fileb,或者通过 bakfilefileb得到 filea

    后面无论是 fileafileb文件损坏了,只要不是两个文件同时损坏,都可以通过两者中未损坏的文件 和 bakfile文件,还原得到另一个文件

    filea文件损坏了,可以通过 filebbakfile进行异或运算得到完好的 filea文件

    fileb  ^  bakfile
    =  fileb  ^ ( filea  ^  fileb )
    =  fileb  ^  filea  ^  fileb        # 根据 x ^ ( y ^ z ) = ( x ^ z ) ^ y
    =  fileb  ^  fileb  ^  filea        # 根据 x ^ x = 0
    =  0  ^ filea                       # 根据 x ^ 0 = x
    =  filea
    

    同样,当 fileb文件损坏了,可以通过 fileabakfile进行异或运算得到完好的 fileb文件

    filea  ^  bakfile
    =  filea  ^ ( filea  ^  fileb )
    =  filea  ^  filea  ^  fileb        # 根据 x ^ ( y ^ z ) = ( x ^ z ) ^ y 
    =  filea  ^  filea  ^  fileb        # 根据 x ^ x = 0
    =  0  ^ fileb                       # 根据 x ^ 0 = x
    =  fileb
    

    解算法题

    有些算法可以利用异或的思路进行求解,下面列出力扣上的一道算法题来说明,题目如下:

    一个长度为 n-1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 ~ n-1 之内,
    
    在范围 0 ~ n-1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字
    
    
    示例 1:
    
    输入: [ 0,1,3 ]
    
    输出: 2
    
    
    示例 2:
    
    输入: [ 0,1,2,3,4,5,6,7,9 ]
    
    输出: 8
    
    

    最快捷的解决方法是把数组的所有元素以及 0n-1之间的整数 全部进行异或运算

    arry[0] ^ arry[1] ^ arry[2] ... ^ arry[n-2] ^ 0 ^ 1 ^ 2 .... ^ (n-1)
    

    由于数组元素值范围在 0n-1,且所有元素值都没有重复

    所以,上述的计算式子中,0n-1每个数会出现两次,只有缺少的那个数仅出现一次,根据异或的性质 x ^ x = 0可知,相同值之间的异或运算等于 0,因此算式的结果其实就是缺少的那个数

    下面给出测试文件 test.cpp,代码是用 C++ 实现的,可以自行用其他语言实现

    #include <stdint.h>
    #include <iostream>
    using namespace std;
    
    int32_t find_missing(int32_t *ary, int32_t len)
    {
        //数组长度小于等于1,直接返回 -1
        if(len <= 1)
        {
            return -1;
        }
        //结果
        int32_t result = 0;
        //result 和 数组中每一个元素值进行异或运算
        for (int32_t i = 0; i < len; i++)
        {
            result ^= ary[i];
        }
        //result 和 0 到 n 中每一个值进行异或运算
        for (int32_t j = 0; j <= len; j++)
        {
            result ^= j;
        }
        return result;
    }
    //编译: g++ -g -o test  test.cpp
    int32_t main(int32_t argc , char *argv[])
    {
        int32_t ary[] = { 0, 1, 3 };
        int32_t result = find_missing(ary, sizeof(ary) / sizeof(int32_t));
        std::cout << "result = " << result << std::endl;
        
        return 0;
    }
    

    使用 g++ -g -o test test.cpp命令编译,接着运行程序,结果如下:

    [root@localhost test]# ./test 
    result = 2
    

    当然,这道题目还有其他的解法,比如:利用加法来解,大家自己去思考下,这里不做介绍了

    题目链接
    https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

    小结

    通过上文,我们可以看到,异或运算在很多方面都有应用,其实,它的应用远不止文中介绍的方面,所以,我们花时间去掌握它是非常值得做的一件事

    展开全文
  • 异或运算加密

    2018-05-09 16:26:19
    异或运算加密,开发环境vs2013,仅支持整型数据加密,能够实现加密和解密。
  • 最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或...
  • 异或运算算法

    2021-08-08 07:24:43
    1异或运算法则 异或运算:相同为0,不同为1 异或运算就记成无进位相加。 满足交换律,结合律。 0^N = N N^N = 0 int a = 7; // 00111 int b = 13; // 01101 01010 = 8+2 = 10 2不用任何空间的情况下交换两个...

    1异或运算法则

    异或运算:相同为0,不同为1
    异或运算就记成无进位相加。
    满足交换律,结合律。
    0^N = N
    N^N = 0
    
    int a = 7; //  00111
    int b = 13; // 01101
    			   01010 = 8+2 = 10
    

    2不用任何空间的情况下交换两个变量

    内存区域不同,可以使用这个方法:

    int a = 13;
    int b = 7;
    
    a = a^b;
    b = a^b;
    a = a^b;
    ---> a = 7; b = 13;
    解释:
    a = a^b; // a = a^b; b = b;
    b = a^b; // a = a^b; b = a^b^b = a^ (b^b) = a^0 = a;
    a = a^b; // a = a^b^a = a^a^b = 0^b = b;
    

    3一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数

    相同为0,交换律。
    [a, b, c, d, e, ...]
    int eor = 0;
    eor = eor^a;
    eor = eor^b;
    eor = eor^c;
    eor = eor^d;
    ...
    eor = eor^...;
    

    4怎么把一个int类型的二进制数,提取出最右侧的1

    a = 01101110010000
    ans= 00000000010000

    a =  01101110010000
    ~a=  10010001101111
    ~a+1=10010001110000
    
    a & (~a+1)
    =a & (-a)
    = 00000000010000
    

    5一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数(奇数次)

    这两种奇数为a,b:
    eor = 0;
    eor = eor^...
    	= a^b != 0; //因为a != b;
    所以:eor的某一位状态为1,利用算法第四题找到这个状态位1。
    所以,可以将所有的数分为:
    1、最右侧的是12、最右侧的是0: 两种。
    eor1 = 0; eor1 ^ ...(第一种的数) = a(假设);
    eor^eor1 = b;
    
    // arr中,有两种数,出现奇数次
        public static void print0ddTimesNum2(int[] arr) {
            int eor = 0;
            for (int i = 0; i < arr.length; i++) {
                eor ^= arr[i];
            }
            // a和b是两种数
            // eor. != 0
            // eor最右侧的1,提取出来
            // eor :00110010110111000
            // rightOne : 000000000001000
            int rightOne = eor & (-eor); //提取出最右的1
            int onlyOne = 0; // eor'
            for (int i = 0 ; i < arr.length; i++) {
                // arr[1] = 111100011110000
                // rightOne= 00000000010000
                if ((arr[i] & rightOne) != 0) {
                    onlyOne ^= arr[i];
                }
            }
            System. out. println(onlyOne +" " + (eor ^ onlyOne));
        }
    

    6 一个数组中有一种数出现K次,其他数出现了M次(M>1,K<M),找到出现了K次的数,要求:额外空间复杂度0(1)

    定义一个int[] t = new int[32]; //存储二进制的每一位数
    将数组中的每一个数转为二进制表示,t数组的每一位累加;
    累加完成之后,数组每一位与M% 运算;
    不是0的位,则为出现k次的数二进制位1的位。
    
    package entity;
    
    /**
     * @email 930312043@qq.com
     * @author: zhaoshuai
     * @date: 2021/8/8 7:15
     */
    public class Soultion {
        public static void onlyKTimes(int[] arr, int k, int m) {
            int[] t = new int[32];
            // t[0]:0位置的1出现了几个
            for (int num : arr) {
                for (int i = 0; i <= 31; i++) {
                    // 依次提取出每一位的状态
                    if (((num >> i) & 1) != 0) {
                        t[i]++;
                    }
                }
            }
            int ans = 0;
            for (int i = 0; i < 31; i++) {
                if (t[i] % m != 0) {
                    ans |= (1 << i);
                }
            }
            System.out.println(ans);
        }
    }
    
    展开全文
  • Python-第七城市609x288 - 73KB - JPEGPython基础(10)--数字_资讯_突袭网609x288 - 33KB - JPEGpython学习笔记之运算符_第1页_web前端开发715x330 - 20KB - PNG【效率提升】Python中的并行运算1728x1080 -...
  • 异或运算 XOR ⊕ 教程

    千次阅读 2021-06-21 13:42:57
    大家比较熟悉的逻辑运算,主要是"与运算"(AND)和"或运算"(OR),还有一种"异或运算"(XOR),也非常重要。 本文介绍异或运算的含义和应用。
  • js 异或运算^

    千次阅读 2022-04-10 10:54:04
    //如果只有一个出现次数是奇数的数的话 , 我们只需要对整个数组进行异或运算 , 算出来的结果就是奇数 //如果有两个出现次数是奇数的数的话 , 我们就需要先对整个数组进行异或运算 , //根据运算结果把元素组分成两个...
  • 认识时间复杂度和异或运算

    千次阅读 2021-11-25 13:10:14
    认识时间复杂度和异或运算 1、时间复杂度: 取最高阶的,当一样的时候就不看时间复杂度了,直接代码运行测试看哪个更快就是时间复杂度更好 时间复杂度一律按照最差时间复杂度进行计算,就跟冒泡排序和选择排序,他们...
  • 什么是异或_异或运算异或运算的作用

    万次阅读 多人点赞 2020-04-28 21:37:18
    什么是异或_异或运算异或运算的作用 异或,是一个数学运算符,英文为exclusive OR,缩写为xor,应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:  a⊕b = (¬a ∧ b) ∨ (a ∧...
  • 282-用P0口显示按位异或运算结果(51单片机C语言实例Proteus仿真和代码)282-用P0口显示按位异或运算结果(51单片机C语言实例Proteus仿真和代码)282-用P0口显示按位异或运算结果(51单片机C语言实例Proteus仿真和代码)...
  • AT89S52单片机C语言应用
  • 异或运算的性质

    2021-07-06 22:37:10
    异或运算的性质 1)0^N == N, N^N == 0 2)异或运算满足交换律和结合率 3)不用额外变量交换两个数 4) 异或就是无进位的相加 int a = A, b = B; a = a ^ b = A ^ B; b = a ^ b = (A ^ B) ^ B = A ^ (B ^ B) = A ^ 0 ...
  • 详解异或运算

    千次阅读 多人点赞 2020-11-12 22:58:50
    搞不懂异或的朋友看过来,文章写得嘎嘎明白。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,969
精华内容 52,387
关键字:

异或运算