c异或运算 c异或运算符号浅谈

位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果

与运算:&
两者都为1为1,否则为0

1&1=1,  1&0=0,  0&1=0,  0&0=0


或运算:|
两者都为0为0,否则为1
1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0


非运算:~
1取0,0取1
~1 = 0, ~0 = 1
~(10001) = 01110


异或运算
两者相等为0,不等为1
1^1=0, 1^0=1, 0^1=1, 0^0=0


下面是详细的解释:

位运算

    位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。

位运算符有:

    &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。
    其中,按位取反运算符是单目运算符,其余均为双目运算符。
    位运算符的优先级从高到低,依次为~、&、^、|,
    其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。

   (1)按位与运算符(&)

    按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
     0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
即同为 1 的位,结果为 1,否则结果为 0。
    例如,设3的内部表示为
     00000011
    5的内部表示为
     00000101
    则3&5的结果为
     00000001
    按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x & 0177。二是让某变量保留某几位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。以上用法都先要设计好一个常数,该常数只有需要的位是1,不需要的位是0。用它与指定的位串信息按位与。

   (2)按位或运算符(|)

    按位或运算将两个运算分量的对应位按位遵照以下规则进行计算:
     0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
即只要有1个是1的位,结果为1,否则为0。
    例如,023 | 035 结果为037。
    按位或运算的典型用法是将一个位串信息的某几位置成1。如将要获得最右4为1,其他位与变量j的其他位相同,可用逻辑或运算017|j。若要把这结果赋给变量j,可写成:
     j = 017|j

   (3)按位异或运算符(^)

    按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
     0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相应位的值相同的,结果为 0,不相同的结果为 1。
    例如,013

### C语言异或运算的使用方法和示例 #### 一、基本概念 C语言中的异或运算是通过 `^` 符来完成的一种位操作。它会对两个整数的每一位进行比较,只有当两位不同(一位为0另一位为1)时,结果才为1;否则结果为0[^1]。 #### 二、实现原理 对于任意两个整数a和b,在执行 `result = a ^ b` 后,其对应的二进制形式会逐位按照上述规则计算得出最终的结果。例如: ```c int a = 5; // 二进制:0101 int b = 3; // 二进制:0011 int result = a ^ b; // result 的二进制:0110,即十进制6 ``` 此过程展示了如何利用异或运算处理简单的数值转换[^2]。 #### 三、实际应用案例分析 ##### 加法器设计 可以借助按位异或特性构建无需传统算术指令即可工作的加法功能模块。以下是具体代码片段展示这一思路的应用场景之一——两数相加而不用"+"符: ```c #include <stdio.h> int add(int x, int y){ while(y != 0){ int carry = (unsigned)(x & y) << 1; x = x ^ y; y = carry; } return x; } int main(){ printf("%d\n",add(-2,3)); //-2+3=1 } ``` 这里运用到了循环结构不断更新被加数与进位直到没有新的进位产生为止[^3]。 ##### 缺失数字查找算法 另一个典型例子是在给定数组里寻找唯一未重复项或者发现序列中存在的缺失值等问题上也经常采用这种方法。比如下面这段程序就是用来找出从零到某个最大自然数之间缺少的那个特定成员的方法论体现: ```c int missingNumber(int* nums, int numsSize){ int target=0;//初始化变量target初值设为0因为任何数同0做XOR都等于自身 for(int i=0;i<numsSize;i++){ target ^=i; //先将索引位置上的连续整数值累积起来 target ^=nums[i]; //再把当前遍历过的每一个元素逐一加入其中抵消掉已存在的配对项目 } target ^=numsSize; //最后还需额外补充最后一个可能遗漏的最大边界条件n本身才行哦~ return target; } ``` 这种技巧依赖于这样一个事实:相同的一对儿正负相反数经过一次完整的异或之后就会相互抵销归零[^4]。 #### 四、注意事项 需要注意的是不同类型长度的数据参与此类位级运算可能会引发一些意想不到的行为模式因此建议开发者们务必清楚知晓所涉及数据类型的存储规格以及相应机器架构下默认填充方式等方面的知识点以便更好地控制整个流程走向达到预期效果[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值