C语言中运算符“^”,“&”,“|”简介

这篇具有很好参考价值的文章主要介绍了C语言中运算符“^”,“&”,“|”简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

异或(^)

       当我们开始学习编程时,我们可能很快会遇到一种被称为"异或"的运算符。异或操作符通常用符号"^"表示,它是一种位运算符,用于对两个二进制数的对应位进行比较。它的运算规则如下:

  • 如果两个对应位相同,结果为0。
  • 如果两个对应位不同,结果为1。

换句话说,异或操作是在两个二进制数的对应位进行比较,并将不同的位设置为1,相同的位设置为0。除了简单的比较作用之外,异或操作还有许多有用的特性和应用场景。

一、异或操作的基本特性

交换律

  a^b = b^a
  异或操作满足交换律,即对于任意的两个数a和b,a异或b的结果与b异或a的结果是相等的。

结合律

(a^b)^c = a^(b^c)
  或操作满足结合律,即对于任意的三个数a、b和c,无论以何种顺序进行异或运算,最终的结果      是相等的。

自反性

   a^a = 0
  任何数与自身进行异或操作的结果都是0。

零值性

  a^0 = a
  任何数与0进行异或操作的结果都是它本身。

二、异或操作的应用

交换两个数的值

使用异或操作可以交换两个变量的值,而无需使用额外的变量。这是因为异或操作具有交换律和自反性的特性。例如,对于变量a和b,可以通过以下代码交换它们的值:

a = a ^ b;
b = a ^ b;
a = a ^ b;

在这个代码片段中,首先将a与b进行异或操作,并将结果赋给a。然后将该结果与b再次进行异或操作,并将结果赋给b。最后,再将a与b进行异或操作,并将结果赋给a。这样就成功地实现了A和B的值交换。

      参考链接:

检测出现奇数次的元素

在一个数组中,如果除了一个元素之外,所有的元素都出现偶数次,那么可以使用异或操作找出这个出现奇数次的元素。将数组中的所有元素进行异或操作,最终得到的结果就是只出现一次的元素。这是因为偶数次的元素经过异或操作会被抵消为0,最终只剩下出现奇数次的元素。

#include <stdio.h>

int findOddElement(int arr[], int n) {
    int result = 0;
    for (int i = 0; i < n; i++) {
        result ^= arr[i];
    }
    return result;
}

int main() {
    int arr[] = {2, 4, 3, 6, 4, 2, 3};
    int n = sizeof(arr) / sizeof(arr[0]);

    int oddElement = findOddElement(arr, n);

    printf("The element that appears odd number of times is: %d\n", oddElement);

    return 0;
}

判断两个数是否相等

使用异或操作可以判断两个数是否相等。如果两个数相等,那么它们的二进制表示的每一位都是相同的,那么进行异或操作之后的结果就是0。因此,通过判断两个数的异或结果是否为0,我们可以确定它们是否相等。

#include <stdio.h>

int areEqual(int a, int b) {
    return a ^ b; // 如果a和b相等,结果为0;如果不相等,结果非零
}

int main() {
    int num1 = 10;
    int num2 = 10;

    if (areEqual(num1, num2) == 0) {
        printf("%d and %d are equal.\n", num1, num2);
    } else {
        printf("%d and %d are not equal.\n", num1, num2);
    }

    return 0;
}

位运算

异或操作也被广泛应用于位运算中,例如对于给定一个二进制数,我们可以使用异或操作来进行位反转、位清零等操作。

总结:

异或操作是一种基本的位运算符,具有许多特性和应用场景。它可以用于交换两个变量的值、检测出现奇数次的元素、判断两个数是否相等等。在位运算中,异或操作也发挥着重要的作用。希望通过本文对异或操作有了更深入的了解,并能在编程中灵活应用它。

按位与(&)

       当我们学习编程时,我们经常会遇到位运算符,其中之一就是"按位与"运算符。按位与运算符通常用符号"&"表示,它对两个二进制数的对应位进行与操作。它的运算规则如下:

  •   对于两个对应位,只有当两个位都为1时,结果位才为1;否则,结果位为0。

换句话说,按位与操作是将两个二进制数的对应位进行比较,并将相同位上的值保留下来,不同位上的值置为0。除了简单的比较作用之外,按位与操作还有许多有用的特性和应用场景。

一、按位与操作的基本特性

零值性

    a & 0 = 0
   对任意整数a进行按位与操作,结果都为0。

自反性

   a & a = a
   将任何数与自身进行按位与操作,结果与自身相等。

清零操作

  a & (-1) = a
  将任何数与全为1的二进制表示进行按位与操作,结果不变。

二、按位与操作的应用

清零特定位

按位与操作常用于清零一个整数的特定位。可以使用一个适当的掩码(mask),将需要清零的位对应位置为0,然后与原值进行按位与操作。掩码是一个具有特定位模式的数,其中位模式上为1的位代表需要保留的位,为0的位代表需要清零的位。

例如,假设有一个整数num,我们想要清零它的第3位,可以使用以下代码:

#include <stdio.h>

int clearBit(int num, int pos) {
    int mask = ~(1 << pos);
    return num & mask;
}

int main() {
    int num = 12; // 假设要清零的整数为12
    int pos = 2;  // 要清零的位为第3位,由于位的编号从0开始,所以这里的pos为2

    int result = clearBit(num, pos);

    printf("The result after clearing the bit is: %d\n", result);

    return 0;
}


这样就将num的第3位清零了。

提取特定位


按位与操作还可以用于提取一个整数的特定位。可以使用一个适当的掩码,将除了需要提取的位以外的其他位都置为0,然后与原值进行按位与操作。

例如,假设有一个整数num,我们想要提取它的第4位,可以使用以下代码:

#include <stdio.h>

int getBit(int num, int pos) {
    return (num >> pos) & 1;
}

int main() {
    int num = 23; // 假设要提取的整数为23
    int pos = 3;  // 要提取的位为第4位,由于位的编号从0开始,所以这里的pos为3

    int bitValue = getBit(num, pos);

    printf("The value of the %dth bit is: %d\n", pos, bitValue);

    return 0;
}

这样就得到了num的第4位的值。

判断奇偶性


奇偶数的二进制表示的最后一位是不同的。利用按位与操作,我们可以判断一个整数的奇偶性。如果一个整数num与1进行按位与操作的结果为0,那么num就是偶数;如果结果为1,那么num就是奇数。

例如,可以使用以下代码判断一个整数的奇偶性:

#include <stdio.h>

int isOdd(int num) {
    return num & 1;
}

int main() {
    int num = 10; // 假设要判断的整数为10

    if (isOdd(num)) {
        printf("%d is an odd number.\n", num);
    } else {
        printf("%d is an even number.\n", num);
    }

    return 0;
}


这样就可以根据按位与操作的结果判断num的奇偶性。

总结:

按位与操作是一种常用的位运算符,它可以用于清零特定位、提取特定位以及判断奇偶性等。在编程中,掌握按位与操作的基本特性和应用场景,能够灵活地应用它来解决各种问题。希望通过本文对按位与操作有了更深入的了解,并能在编程中灵活应用它。

当讨论按位与操作时,让我们考虑一些具体的二进制示例,以更清楚地说明按位与操作的原理和应用。

示例1:清零特定位

假设我们有一个二进制数 ,我们想要清零它的第4位(从右往左,从0开始计数)。11011010
原数:   11011010
掩码:   11101111  (第4位为0,其他位为1)
结果:   11001010
使用按位与操作,我们可以将原数的第4位清零,得到结果 。11001010

在C语言中,可以使用以下代码来实现这个操作:

int num = 0b11011010;   // 二进制表示法
int mask = ~(1 << 3);   // 创建一个第4位为0,其他位为1的掩码
num = num & mask;       // 将num与掩码进行按位与操作

示例2:提取特定位

假设我们有一个二进制数 ,我们想要提取它的第3位。10110100
原数:   10110100
掩码:   00000100  (第3位为1,其他位为0)
结果:   00000100
使用按位与操作,我们可以将原数的其它位清零,得到结果 。00000100

在C语言中,可以使用以下代码来实现这个操作:

int num = 0b10110100;   // 二进制表示法
int mask = 1 << 2;      // 创建一个第3位为1,其他位为0的掩码
int result = num & mask; // 将num与掩码进行按位与操作

示例3:判断奇偶性

假设我们有一个二进制数 ,我们想要判断它的奇偶性。1011101
原数:   1011101
与 1:   0000001
使用按位与操作,将原数与  进行按位与操作,结果为 ,表示这个数是奇数。11

在C语言中,可以使用以下代码来判断一个整数的奇偶性:

int num = 0b1011101;  // 二进制表示法
if (num & 1 == 0) {
    printf("num是偶数\n");
} else {
    printf("num是奇数\n");
}


这些示例展示了按位与操作在二进制数处理中的常见应用,包括清零特定位、提取特定位以及判断奇偶性。希望这些例子能帮助你更好地理解按位与操作的用途和工作原理。

按位或( | )

       

       当我们谈论位操作时,按位或(|)是一个非常有用且常见的操作符。按位或操作是一种二进制操作,它允许我们在两个二进制数中的每个位上执行逻辑或操作。在这篇博客中,我们将深入探讨按位或操作的工作原理、用途以及一些示例。

按位或的基本原理


       按位或操作是一种在两个二进制数中的每个对应位上执行逻辑或操作的操作。其工作原理非常简单:如果两个对应的位中至少有一个为1,那么结果位将为1,否则为0。以下是按位或操作的真值表:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

按位或的用途

按位或操作在计算机编程和电子工程中有广泛的应用,以下是一些常见的用途:

  1. 1.设置特定位的值: 按位或操作可用于将某个特定的位设置为1,而保持其他位不变。这是通过将要设置的位设置为1,然后将其与原始值进行按位或操作来实现的。
  2. 2.合并标志位: 在许多编程任务中,不同的标志位用于表示各种条件或状态。按位或操作可用于将多个标志位合并为一个值,以便进行更方便的条件检查。
  3. 3.掩码操作: 通过使用按位或操作,可以将一个二进制数的特定位与一个掩码值进行合并或设置,同时保持其他位不变。这种操作用于数据处理和编码中的复杂任务。
  4. 4.生成位掩码: 按位或操作可以用于生成位掩码,这是一个用于与其他值进行按位与操作的二进制数。位掩码通常用于从其他值中提取特定的位或信息。

示例
让我们通过一些示例来演示按位或操作的实际用途。
示例 1:

设置特定位的值

假设我们有一个8位的二进制数,其中我们想要将第3位设置为1,同时保持其他位不变。我们可以使用按位或操作来实现这个目标:

unsigned char originalValue = 0b00101000; // 8位二进制数
unsigned char mask = 0b00000100;          // 要设置的位的掩码
unsigned char result = originalValue | mask;

在这个示例中,originalValue 表示原始的8位二进制数,mask 表示要设置的位的掩码,最后,result 将包含设置第3位后的结果。

示例 2:

合并标志位

       在许多编程任务中,我们使用标志位来表示不同的条件或状态。例如,在处理文件权限时,我们可能使用不同的标志位来表示读、写和执行权限。按位或操作可用于将这些标志位合并为一个值,以便进行更方便的条件检查:

#define READ_PERMISSION  0b00000001 // 读权限标志位
#define WRITE_PERMISSION 0b00000010 // 写权限标志位
#define EXECUTE_PERMISSION 0b00000100 // 执行权限标志位

unsigned char userPermissions = READ_PERMISSION | WRITE_PERMISSION;

在这个示例中,我们定义了三个不同的权限标志位,然后使用按位或操作将它们合并为 userPermissions 变量,以表示用户的权限。


总结


       按位或操作是一种在计算机编程和电子工程中广泛使用的位操作。它允许我们在两个二进制数的每个位上执行逻辑或操作,从而实现多种实际应用,包括设置特定位的值、合并标志位、掩码操作和生成位掩码等。通过了解按位或操作的基本原理和用途,我们可以更好地利用这个强大的工具来解决各种问题。文章来源地址https://www.toymoban.com/news/detail-755068.html

到了这里,关于C语言中运算符“^”,“&”,“|”简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go 语言运算符

    文章目录 概要 整体架构流程 技术名词解释 技术细节 小结 🌟  欢迎来到 猫头虎的博客   — 探索技术的无限可能! 深入探索各技术领域,发现知识的交汇点。了解更多,请访问: - [ 猫头虎技术矩阵 ](https://bbs.csdn.net/topics/617720781) - [ 新矩阵备用链接 ](https://bbs.csdn.net/topi

    2024年02月05日
    浏览(14)
  • C语言中的除法运算符“/”与取模运算符“%”:深入解析与示例

    🔥温馨提示🔥:使用电脑端阅读,获取更好体验🚀 在C语言中, / 和 % 运算符是与除法相关的两个运算符,它们有以下特点: / (除法运算符): 用途:计算两个数之间的除法。 结果类型:如果两个操作数都是整型,结果也将是整型,且向下取整(即忽略小数部分,也称

    2024年03月15日
    浏览(31)
  • C语言—位运算符

    目录 (位与,AND): |(位或,OR): 位取反(~): 左移(): 右移(): 语法: a b 作用:将两个整数的对应二进制位进行逐位与运算,如果对应位都为1,则结果对应位为1;否则为0。 语法: a | b 作用:将两个整数的对应二进制位进行逐位或运算,如果对应位中至少有一个为1,

    2024年02月07日
    浏览(15)
  • 运算符详解(c语言)

    引言: hello,大家好!我是心跳sy,今天给大家分享c语言运算符详解,我们知道,c语言的一个显著特点就是表达式的应用,表达式是表示如何计算值的公式,而运算符又是构建表达式的基本工具,c语言拥有非常丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、赋

    2024年02月12日
    浏览(12)
  • C 语言运算符详解

    运算符用于对变量和值进行操作。 在下面的示例中,我们使用 + 运算符将两个值相加: 虽然 + 运算符通常用于将两个值相加,就像上面的示例一样,它还可以用于将变量和值相加,或者将变量和另一个变量相加: C 将运算符分为以下几组: 算术运算符 赋值运算符 比较运算

    2024年02月04日
    浏览(20)
  • C语言运算符详解

    【导言】 C语言是一门非常底层的编程语言,它支持多种运算符进行数值运算、逻辑运算等操作。C语言中的运算符主要有算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符等。本篇文章将会详细介绍C语言中的各种运算符及其使用方法。 一、算术运

    2024年02月07日
    浏览(13)
  • C语言关于&与&&运算符

    C语言关于与运算符 我们知道,在很多场景中和通常可以相互代替,那么它们到底有什么不同呢? 先看一段代码 使用clang++ -S编译出来的指令如下: 使用clang++ -S -O3编译出来的指令如下: 再看一段代码: 其汇编代码为: 反汇编一下: 通过对比两段汇编代码就很清晰了,运算

    2024年02月10日
    浏览(14)
  • C语言中的 |、||、&、&&、^、~、<<、>> 运算符

    大家好,这篇文章主要介绍一下C的 |、||、、、异或、~、!运算符,希望这些知识可以帮助到大家。 首先我们来了解一下什么是位运算,从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将

    2023年04月08日
    浏览(12)
  • C语言控制语句——运算符

    运算符 术语 示例 结果 + 正号 +3 3 - 负号 -3 -3 + 加 10 + 5 15 - 减 10 - 5 5 * 乘 10 * 5 50 / 除 10 / 5 2 % 取模(取余) 10 % 3 1 ++ 前自增 a=2; b=++a; a=3; b=3; ++ 后自增 a=2; b=a++; a=3; b=2; – 前自减 a=2; b=–a; a=1; b=1; – 后自减 a=2; b=a–; a=1; b=2; 示例代码: 运行结果: 运算符 术语 示例 结果 = 赋值

    2024年02月10日
    浏览(14)
  • Go语言中的运算符

    运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 除法注意:如果运算的数都是整数,那么除后,去掉小数部分,保留整数部分  取余注意    余数=被除数-(被除数/除数)*除数   注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。  且在 golang 中没有前

    2024年02月12日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包