首页 > 其他分享 >【……挣扎】奇妙的位运算之异或的运用

【……挣扎】奇妙的位运算之异或的运用

时间:2023-09-04 20:45:04浏览次数:26  
标签:0000 运算 nums int 奇妙 异或 翻转

很震撼啊,上午c++第三题死活没想出来哪里来的最优算法,c无聊翻leetcode找到了

难怪呢,O(N),那是够少的

我是真不会位运算啊orz,但是很有趣,遂记

(另:我讨厌leetcode的输入方式!以及,我看不懂,题解到底,在写些什么)


先是,关于c++的位运算

参考资料 https://blog.csdn.net/SenyeLicone/article/details/52196039

    https://www.cnblogs.com/jaszzz/p/12635375.html   (这个排版好酷)

     离散数学

*运算数据按照二进制按位运算后,会转化为原数据类型

较常用:按位与、或、非、异或(诡异的好用!)

    &   |  !  ^

暂时接触不多:取反(~),左移(<<),右移(>>)

&:

 1.清零

可以和0做&运算,直接清零。(为什么不等于0啊)

2.取数中 指定位

取一个数,指定位上为1,其余为0,做&运算

|

将指定位 变为1,和在该位为1的数做|运算

^

好!东!西!

异或运算,在该位相同为0,相异为1

(1)使特定位翻转 找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。

  例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。 

(2)与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。

(3)也是!非常重要!用于下题(及类似题的思路)

判断一个数出现了几次!!!!!!!

请看——


 

Leetcode136

来我们忽略那个奇怪的输入输出

一般可以的思路(暴力):快排一次,然后每一位和下一位比较,不同即输出

 压缩复杂度,也就是经题解说的,位运算(!)

异或运算,每一位相同返回0,不同返回1,那么——

  ·1.两个相同的数,异或后一定为0;

  2.0与任何数异或都为这个数本身

  3.异或没有顺序

可以由此想到,题目中所有偶数次 数异或后为0,单数次 数异或后保留,故输出所有位数异或结果,即为单数次数本身!

是不是!超级奇妙!O(N)!好耶!

代码(正在研究陌生的写法中,这份是别人的,研究好后替换)

 

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int x = 0;
        for (int num : nums)  // 1. 遍历 nums 执行异或运算
            x ^= num;
        return x;            // 2. 返回出现一次的数字 x
    }
};
View Code

 

 

暂存于此

矩阵幂

c 作业 2
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int k;
scanf("%d", &k);//测试样例个数
for (int t = 1; t <= k; t++)
{
int M, N;
int a[100][100], b[100][100];
int c[100][100];
scanf("%d %d", &M, &N);//矩阵大小,几次幂
for (int i = 0; i < M; i++)
for (int j = 0; j < M; j++)
{
scanf("%d", &a[i][j]);
b[i][j] = a[i][j];
c[i][j] = 0;
}
for (int s = 2; s <= N; s++)
{
for (int i = 0; i < M; i++)
for (int j = 0; j < M; j++)
{
c[i][j] = 0;
}
for (int i = 0; i < M; i++)
for (int j = 0; j < M; j++)
{
for (int k = 0; k < M; k++)
c[i][j] += a[i][k] * b[k][j];
}
for (int i = 0; i < M; i++)
for (int j = 0; j < M; j++)
{
a[i][j] = c[i][j];
}
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < M; j++)
{
printf("%d ", c[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}

 

标签:0000,运算,nums,int,奇妙,异或,翻转
From: https://www.cnblogs.com/Phantomhive/p/17678045.html

相关文章

  • Java 编程中的魔法之门:探索I/O流的奇妙世界
    文章目录什么是I/O流?I/O流的层次结构1.字节流(ByteStreams)2.字符流(CharacterStreams)3.缓冲流(BufferedStreams)4.数据流(DataStreams)5.对象流(ObjectStreams)I/O流的应用场景1.文件操作2.网络通信3.用户输入输出4.数据持久化5.图像、音频、视频处理示例:读写文件数据总......
  • 位运算基础
    目录位运算与、或、异或取反左移和右移复合赋值位运算符关于优先级位运算的应用有关2的幂的应用取绝对值取两个数的最大/最小值判断两非零数符号是否相同交换两个数操作一个数的二进制位汉明权重位移实现LSB置零操作x&-x实现n&(n-1)实现构造汉明权重递增的排列位运算......
  • maven打包提示“-source1.5中不支持diamond运算符终极解决办法”
    把所有能设置Java的地方都改过来了,还是不行,最后在Maven的setting.xml中设置了一下Jdk好使了<profiles><profile><id>jdk1.8</id><activation><activeByDefault>true</activeByDefault><jdk......
  • 3、运算精度的选择(P106)
    1、fp16和fp32有什么区别?FP32(单精度浮点数)和FP16(半精度浮点数)是两种不同的浮点数表示方式,它们在精度和存储空间上有显著的区别。下面是它们的主要区别以及一个示例来说明这些区别:精度:FP32:单精度浮点数使用32位来表示一个数,其中包括1位符号位、8位指数位和23位尾数位。它具有......
  • 探索图像数据中的隐藏信息:语义实体识别和关系抽取的奇妙之旅
    探索图像数据中的隐藏信息:语义实体识别和关系抽取的奇妙之旅1.简介1.1背景关键信息抽取(KeyInformationExtraction,KIE)指的是是从文本或者图像中,抽取出关键的信息。针对文档图像的关键信息抽取任务作为OCR的下游任务,存在非常多的实际应用场景,如表单识别、车票信息抽取、......
  • 探索图像数据中的隐藏信息:语义实体识别和关系抽取的奇妙之旅
    探索图像数据中的隐藏信息:语义实体识别和关系抽取的奇妙之旅1.简介1.1背景关键信息抽取(KeyInformationExtraction,KIE)指的是是从文本或者图像中,抽取出关键的信息。针对文档图像的关键信息抽取任务作为OCR的下游任务,存在非常多的实际应用场景,如表单识别、车票信息抽取、......
  • Java:移位运算符左移运算符<<、右移运算符>>、无符号右移运算符>>>
    目录符号位左移运算符<<右移运算符>>无符号右移运算符>>>其他符号位二进制形式最左边的第一位是符号位0表示正数1表示负数例如十进制:1二进制原码:00000000000000000000000000000001十进制:-1二进制原码:10000000000000000000000000000001左移运算符<<规则:丢弃左边指定位数......
  • Go 运算符
    运算符用于对变量和值执行操作。加号运算符(+)将两个值相加,如下面的示例所示:示例代码:packagemainimport("fmt")funcmain(){vara=15+25fmt.Println(a)}尽管加号运算符通常用于将两个值相加,但它也可以用于将变量和值相加,或者将一个变量和另一个变量相加......
  • Java 乘等赋值运算
    下面这个题目是在一公司发过来的,如果你对Java的赋值运算比较了解的话,会很快知道答案的。  这个运算符在Java里面叫做乘等或者乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数。例如下面的:density*=invertedRatio; 其实等于的就是 density=density*invertedR......
  • 汇编加法减法运算
    加法计算机知会位运算,那么二进制加法的结果在不考虑进位的情况下,与异或的结果相同。4+50000010000000101--------------00000001那么怎么判断进位了,通过与运算,如果结果包含1则发生进位。0000010000000101--------------00000100显然发生了进位,接着把结果左移动......