首页 > 其他分享 >位运算

位运算

时间:2024-04-18 22:47:28浏览次数:14  
标签:right 运算 奇数 个数 偶数 异或 result

1.数组内存在一个个数为奇数的数,其余数个数都为偶数,求这个数。

解决该问题要用到位运算中的异或,首先要了解异或的特性:
1.a ^ 0 = a
2.a ^ a = 0
3.异或满足交换律和集合律:a ^ b = b ^ a, a ^ b ^ c = a ^ (b ^ c)


因此面对该问题,可以将数组内的数全部异或,由于其余数为偶数个,异或结果最终为0,奇数个的数异或后会剩下一个,因此可以求出该数

2.数组内存在两个不相同的个数为奇数的数,其余数个数都为偶数,求这两个数。

假设这两个数为a,b,由上述特性可知异或后的结果result为a ^ b,因为a和b不相同,因此a ^ b的结果(result)里必定存在一位为1。通过这个1可以将a和b区分开:

将数组里该位为1的数进行异或,因为a和b该位不同,因此肯定能将它们分开,而由于其他数的个数都为偶数,所有异或后又只剩下了a或b其中的一个,最后将result异或新的结果,便能得到另一个数。

        a := []int{11, 11, 5, 5, 8, 8, 7, 7, 7, 3, 3, 3}   //两个不相同的数个数为奇数,其余数个数为偶数
	result := 0
	for _, v := range a {
		result ^= v    //假设两个数为a,b  异或后result结果为a^b
	}
	one := 0
	right := result & (^result + 1)  //因为a不等于b所有result不为0,存在至少一位为1,通过result & (^result + 1)得到最右边为1的一位,a和b在这位上不相同
	for _, v := range a {
		if v&right == right { //通过v&right == right可以将a和b分开,等式右侧可以换成0
			one ^= v   //最终异或结果会只剩下a或b其中一个
		}
	}
	fmt.Println(one, one^result)

标签:right,运算,奇数,个数,偶数,异或,result
From: https://www.cnblogs.com/tjhzdsa/p/18144680

相关文章

  • 第五节 极限运算法则
    第五节极限运算法则  本节讨论极限的求法,主要是建立极限的四则运算法则和复合函数的极限运算法则,利用这些法则,可以求某些函数的极限定理1:两个无穷小的和是无穷小。  用数学归纳法可证:有限个无穷小之和也是无穷小定理2:有界函数与无穷小的乘积是无穷小.  推论1:常......
  • 利用C语言进行常见的数学运算:一元二次方程求根
    从键盘输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根并保留两位小数.#include<stdio.h>//使用printf,scanf函数.#include<math.h>......
  • JTCR-运算符-02
    算术运算符算术操作符不能对boolean类型使用,可以对char类型使用,因为char类型是int类型的子集。除操作符对整数使用,结果为整数。取模运算符对整数和浮点数使用,都返回余数。在某些情况下,复合赋值操作符比它的等价形式更有效率。位运算符运算符运算结果~按位......
  • shell脚本中的运算符和条件判断
    shell脚本中的运算符和条件判断:一、算术运算符在Shell脚本中,你可以使用各种运算符来执行数学运算、比较和逻辑操作。计算方式:$[]$(())例:a=$[(9+5)90]打印输出结果==>echo$a二、条件判断判断方式:test$a=90[$a=90]注意事项:判断处理中间空格隔开数字......
  • 1034 有理数四则运算
    没做出来,看dalao的,dalao超巨。注意的点:分子0的处理/计算公约数的时候取正不然会改变正负性reduction为核心方法#include<bits/stdc++.h>usingnamespacestd;#definelllonglongstructFraction{ llfenzi,fenmu;};intgcd(inta,intb){ if(b==0)returna; ret......
  • 结对编程-c++四则运算
    题目:小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之间–尽可能地多设置......
  • 结对编程-C++四则运算
    小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之间–尽可能地多设置一......
  • shell-运算符
    一、算术运算符expr表达式orvar=`expr表达式`1、示例[root@vm-paasscwyfy]#catexpr_demo.sh#!/bin/bashread-p"请输入第一个数字:"aread-p"请输入第二个数字:"becho"a=${a},b=${b}"echo"a+b=`expr${a}+${b}`"echo"a-b=`exp......
  • FPGA器件实现逻辑运算的基本原理是(   )。
    选项:A、采用最小项相加的电路形式实现逻辑运算B、采用与非门电路实现逻辑运算C、采用异或门电路实现逻辑运算D、采用查找表的方式实现逻辑运算答案:D解析:组成FPGA的两个最基本的部分是组合逻辑以及时序逻辑,分别实现这两个基本部分的结构就是FPGA的基本单元。组合逻辑......
  • 结对编程-C#-四则运算
    结对编程-四则运算要求:小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之......