28:位运算(异或初级)

异或是一个二元运算符 表示为 x^y

   通过这个表,我们得出一些结论:
  1)两个相同的十进制数异或的结果一定为零。
  2)任何一个数和 0 的异或结果一定是它本身。
  3)异或运算满足结合律和交换律。

异或的简单运用1:将一个二进制X的第4位如果为0设置为1,如果为1设置为0

 int a = 101010 ^ 1000;

可以表示为 101010^1000=100010

X的每一位和Y的每一位做异或运算。参考上图表,如果双方都为1设置位1,如果双方都为0还=0;

异或的简单运用2:变量交换

   private void Sawp(int a, int b)
    {
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
    }

异或的简单运用3:出现奇数次的数

输入N个数 其中一个数出现奇数次,另外的数出现偶数次,求这个出现奇数次的数、

private void Oddnuber(int[] args)
    {
        int ans = 0;
        for (int i = 0; i < args.Length; i++)
        {
            ans = ans ^ args[i];
        }
    }

代码注解: 两个相同的数进行异或操作  结果位0。如果在一个数组内同一个数出现的次数为偶数 

异或结果必定为0,如果0和出现奇数次的数异或,结果是其自身

异或简单运用3:

给你编码后的数组 encoded 和原数组 arr 的第一个元素 firstarr[0])。

请解码返回原数组 arr 。

编码规则:encoded[i] = arr[i] XOR arr[i + 1] 。

private int[] result(int[] nueber, int InitV1)
    {
        int[] ruselt = new int[nueber.Length + 1];
        ruselt[0] = InitV1;
        for (int i = 1; i < nueber.Length + 1; i++)
        {
            ruselt[i] = nueber[i - 1] ^ ruselt[i - 1];
        }
        return ruselt;
    }

首先一定要理解体意:

下列代码是将数组里的值进行加密操作

   private int[] Decode(int[] Initnumbers)
    {
        int[] temp = new int[Initnumbers.Length - 1];
        for (int i = 0; i < Initnumbers.Length - 1; i++)
        {
            temp[i] = Initnumbers[i] ^ Initnumbers[i + 1];
        }
        return temp;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值