从底层理解异或(^)运算 | 您所在的位置:网站首页 › 4和4和4和4等于2 › 从底层理解异或(^)运算 |
从底层理解异或运算
异或运算补充1 异或运算定义2 异或运算性质3 例题一3 例题二
异或运算补充
1 异或运算定义
异或运算是属于逻辑运算中的一种 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0 也可以理解为无进制相加 1 0 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 ———————— 0 1 1 0 1 1 1 0 0 2 异或运算性质1)、0与任何一个数异或结果都为该数 任何一个数与自己异或都为0 0 ^ N = N N ^ N = 0 2)、异或运算满足交换律和结合律 a ^ b = b ^ a a ^ b ^ c = a ^ ( b ^ c ) 3)、如果是一堆数 进行异或运算,最终结果与这堆数异或运算的顺序无关。 示例:交换ab的值(在不额外申请新变量的情况下): int a = 甲; int b = 乙; a = a ^ b; b = a ^ b; a = a ^ b; (注:此操作必须保证a和b在内存中必须是两块东西,如果是相同的位置 就会洗成0) 证明 (根据以上定理): int a = 甲; int b = 乙; 操作aba = a ^ b;a = 甲 ^ 乙b = 乙b = a ^ b;a = 甲 ^ 乙b = 甲 ^ 乙 ^ 乙 = 甲a = a ^ b;a = 甲 ^ 乙 ^ 甲 = 乙b = 甲 3 例题一已知一个整数数组 arr[] ,有一种数出现了奇数次其他的数都出现了偶数次。求该数。 要求 时间复杂度为O(N),空间复杂度为 O(1)。 求解: :首先定义一个变量 : int eor = 0; 然后让eor与数组中的每个数都异或一遍,最后eor的值就是出现奇数次的这个数。 例题一 function oneOddNumber(arr) { let eor = 0; for (let i = 0; i let ero = 0; for (let i = 0; i if ((arr[i] & rightOne) === 0){ hep ^= arr[i]; } } console.log(hep); console.log(ero ^ hep); } let array = [1,1,2,3,3,3,3,4,4,4,5,5] // 打印出 2 4 printOddTimesNum(array) |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |