【总结】异或

「MtOI2019」永夜的报应

辉夜手里有 n \rm{n} n个非负整数 a \rm{a} a1, a \rm{a} a2, …… a \rm{a} an;

由于辉夜去打 Gal Game 去了,她希望智慧的你来帮忙。

  • 你需要将这些数分成若干组,满足 n \rm{n} n个数中的每一个数都恰好被分到了一个组中,且每一组至少包含一个数。

定义一组数的权值为该组内所有数的异或和。请求出一种分组方案,使得分出的所有组数的权值之和最小,输出权值之和的最小值。

分析:
我们知道^为异或运算,而异或运算有一个性质:

a^b<=a+b

所以无论怎样分,结果是肯定不大于全部异或的值。

#include<cstdio>
int n,x,ans;
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%d",&x);
		ans^=x;
	}
	printf("%d",ans);
}

资料:

题目1:

一个整型数组里除了1个数字出现 奇数次 外,其他数字都出现 偶数次 ,请找出 只出现奇数次的 这个数。

要求: 时间复杂度 O(n) ,空间复杂度 O(1)。

解题思路:

1、我们知道 2个相同的数异或的结果为0, 所以我们将这n个数从头到尾 异或一遍得到结果x

2、于是乎,我们便得到了结果……

题目2:

一个整型数组里除了两个数字出现 奇数次 外,其他数字都出现 偶数次 ,请找出 只出现奇数次的 这两个数。

要求: 时间复杂度 O(n) ,空间复杂度 O(1)。

解题思路:

根据题目1,我们可以想到,能不能将这两个数分开呢……

1、我们将这n个数从头到尾 异或一遍得到结果x

2、根据x的二进制表示中不为1的某一位,位置为y,然后将这n个数分成两类:y位置为1和y位置为0

3、将这两类数分别异或得到两个数a和b,便是我们所要求得结果

  • 首先出现奇数次的这两个数可定时不想等的,

  • 所以两个出现奇数次的数在y位置上的二进制表示肯定是不同的,

  • 否则y位置的结果不可能为1。

  • 这样便将这两个数分开了。

  • 又因为,每一类数中的其他数异或之后肯定为0,

  • 所以,便得到结果啦……

题目3:

给你1到n这n个数,无序,现将其中一个数x改变成y,找出这两个数

要求: 时间复杂度 O(n) ,空间复杂度 O(1)。

解题思路:

刚开始想排序,不过O(n)的复杂度,很难(⊙o⊙)哦 ,根据上一题,可以这么考虑:
相当于我们有了两个数组,题目中所给的一个和从1到n这个有序的数组,然后就跟上一题一样(≧▽≦)/啦啦啦

1、求出1到n的异或值x

2、继续将x与题目中所给的所有数值异或,得到新的x

3、根据x的二进制表示中不为1的某一位置y,然后将这n*2个数分成两:y位置为1和y位置为0

4、将这两类数分别异或得到两个数a和b,便是我们所要求得结果


问题:求1到n这n个整数间的异或值,即 1 xor 2 xor 3 … xor n
定理:

f(1, n) = f(0, n) =

n : n % 4 == 0

1 : n % 4 == 1

n +1 : n % 4 == 2

0 : n % 4 == 3

可以用数学归纳法予以证明

#include<cstdio>
int n,tot;
int main() {
	for(int n=2;n<=100;n++) {
		int t = n & 3;
		//取出整数n在二进制表示下的第0~k-1位:n & ( ( 1 << k ) - 1 ) 
        if (t & 1) tot= (t / 2) ^ 1;
        else tot= (t / 2) ^ n;
        printf("%d:%d\n",n,tot);
	}
}
<think>好的,用户想了解PLC异或。首先,我需要确定他们对PLC的基础知识有多少了解。PLC是工业控制中常用的设备,异或运算可能用于逻辑控制程序中。可能他们遇到了相关的编程问题,或者在学习过程中遇到了这个概念。 首先,我应该解释异或运算的基本定义,即XOR运算,说明它在布尔代数中的行为:输入相同时输出0,不同时输出1。然后,需要将这个逻辑概念与PLC编程联系起来,比如在梯形图中如何表示异或指令,可能涉及常开触点、并联、串联等元素。 接下来,可能需要举例说明异或的应用场景,比如互锁控制、状态切换或故障检测,这样用户能理解实际用途。同时,要提到不同PLC品牌(如西门子、三菱、欧姆龙)中异或指令的不同表示方法,因为用户可能需要具体型号的信息。 还要考虑用户可能的误区,比如将异或与或运算混淆,所以需要对比说明。另外,确保使用正确的中文术语,并按照要求使用LaTeX格的数学表达,比如异或的真值表可以用表格形展示,但这里可能需要用文字描述,或者用行内公如$A \oplus B$。 检查是否需要覆盖异或在PLC中的实现方,包括梯形图和指令列表,以及可能涉及的注意事项,比如输入输出类型、扫描周期的影响。最后,总结异或的重要性,强调在逻辑控制中的灵活性和实用性。 需要确保结构清晰,分步骤解释,避免使用复杂术语,同时保持准确。如果有必要,可以给出一个简单的梯形图示例,但可能用文字描述更合适。同时提醒用户注意不同品牌的差异,建议查阅具体手册。这样用户能得到全面的理解,并能应用到实际编程中。</think>PLC中的**异或(XOR)**是一种逻辑运算,广泛用于工业控制程序的逻辑设计。以下从定义、实现方和应用场景逐步说明: --- ### 一、异或(XXOR)的定义 异或运算的规则为: **输入值相同时输出0,不同时输出1**,其布尔表达为: $$ Y = A \oplus B = (A \cdot \overline{B}) + (\overline{A} \cdot B) $$ 真值表如下: | A | B | Y | |---|---|---| | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 | --- ### 二、PLC中异或的实现方 #### 1. **梯形图(Ladder Diagram)** - 通过组合常开/常闭触点和并联/串联结构实现: ```plaintext --|A|----|/B|--(Y) --|/A|---|B|---(Y) ``` - **逻辑解释**:当A和B状态不同时,至少一条路径导通,输出Y为1。 #### 2. **指令列表(IL)或结构化文本(ST)** - 直接使用异或指令(不同品牌指令名不同): - **西门子(S7)**:`XOR` 或 `XORB`(位异或) - **三菱(Mitsubishi)**:`XOR` - **欧姆龙(Omron)**:`XORW`(字异或) --- ### 三、异或的典型应用场景 1. **互锁控制** - 例:两台电机不允许同时启动,但允许单独运行。 $$ \text{电机启动信号} = \text{启动按钮} \oplus \text{另一电机运行状态} $$ 2. **状态切换** - 例:按钮按下时切换设备状态(开↔关),类似“乒乓”控制。 $$ \text{新状态} = \text{旧状态} \oplus \text{按钮触发信号} $$ 3. **故障检测** - 对比两个冗余传感器的信号,若不一致则触发报警: $$ \text{报警信号} = \text{传感器1} \oplus \text{传感器2} $$ --- ### 四、注意事项 1. **输入/输出类型匹配**:确保操作数为布尔型(位)或整型(字/双字)。 2. **扫描周期影响**:异或运算结果随输入状态实时更新,需注意时序逻辑的同步性。 3. **品牌差异**:不同PLC厂商的指令名称和语法可能不同,需查阅手册。 --- ### 五、与“或(OR)”运算的区别 - **OR**:任一输入为1时输出1(包含性逻辑)。 $$ Y = A + B $$ - **XOR**:仅当输入不同时输出1(排他性逻辑)。 $$ Y = A \oplus B $$ --- 通过合理应用异或逻辑,可简化复杂控制逻辑,提高程序的灵活性和可靠性。实际编程时需结合具体PLC型号的指令集进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值