操作符详细解说,让你的编程技能更上一层楼

本文详细解读了C++中的位运算,包括位移、按位逻辑操作符,以及它们在编程中的实际用途,如奇偶性检测和数据交换
摘要由CSDN通过智能技术生成

d9469295e6e141d38218f8a54968463c.jpeg

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨
🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞
📝专栏指路:
📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。
📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

文章重点:介绍位位移操作符与位操作符

操作符的分类

操作符在编程中扮演着至关重要的角色,它们用于执行各种操作,如算术运算、逻辑判断、位操作等。下面是一些常见的操作符分类:

  1. 算术操作符:用于执行基本的数学运算。常见的算术操作符包括加法(+)、减法(-)、乘法(*)、除法(/)和取模取余数(%)等。

  2. 比较操作符(或关系操作符):用于比较两个值的大小或是否相等。比较操作符包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)等。它们用于在条件语句中判断条件是否成立。

  3. 逻辑操作符:用于组合或反转布尔值(真或假)。逻辑操作符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)等。这些操作符在条件判断、循环控制等方面非常有用。

  4. 位操作符:直接对整数类型(byte, short, int, long, char)的二进制位进行操作。位操作符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)它们常用于低级编程和性能优化。

  5. 移位操作符:左移(<<)、右移(>>)

  6. 赋值操作符:用于将右侧的值赋给左侧的变量。基本的赋值操作符是等号(=),但还有复合赋值操作符,如加等(+=)、减等(-=)、乘等(*=)、除等(/=)等,这些操作符可以简化代码,实现先运算后赋值的操作。

  7. 条件(三元)操作符:这是唯一一个需要三个操作数的操作符。它的形式是“条件 ? 表达式1 : 表达式2”,如果条件为真,则执行表达式1,否则执行表达式2。

  8. 单目操作符:递增(++)、递减(--)、逻辑非(!)、取地址(&)、sizeof、解引用(*)

  9. 其他操作符:下标引用[ ]、逗号(,)、函数调用()、结构成员访问: . 、->

操作符的属性:优先级、结合性

1.优先级:即表达式中操作符的执行顺序。由高到低执行,常用的操作符的优先级高低记忆(由高到低):

括号(最高),单目操作符(++、--),算术操作符(乘、除、取模、加、减)【也是由高到低】、位移操作符、关系操作符、位操作符、逻辑操作符、条件操作符、赋值操作符、逗号操作符(最低)

2.结合性:即具有相同优先级的操作符的执行顺序。大多数从左到右结合;单目运算符,赋值运算符,条件运算从右到左结合。

二进制,原码,反码,补码
在详细介绍操作符前,我们先来回顾一下二进制,原码,反码,补码的知识,这是我们今天要重点介绍的位移操作符和位操作符的铺垫。

  1. 二进制: 2进制的数字每⼀位都是0~1的数字组成,满2进1。例如:1101 就是⼆进制的数字(与十进制满十进一类似)
  2. 二进制与十进制相互转换:
  • 二转十:以1101为例
    二进制数字1101
    转换过程一乘二的三次方一乘二的二次方0乘二的一次方一乘二的零次方
    十进制数字8401

    再全部加起来得到了十进制数字13

  • 十转二:以31为例
  • de2429218b4b40538e7489193725d969.png由下到上读取

    得到31的二进制数字11111

3.原码、反码、补码:

  • 整数的2进制表示方法有三种,即原码、反码和补码
  • 有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。
  • 符号位是“0”表示整数,是“1”表示负数
  • 正整数的原、反、补码都相同。
  • 负整数的三种表示方法各不相同。
  1. 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
  2. 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
  3. 补码:反码+1就得到补码。
  • 反码得到原码:取反,+1的操作。

对于整形来说:数据存放内存中其实存放的是补码。
原因:
在计算机系统中,数值用补码来表示和存储。原因在于,用补码,可以将符号位和数值域统一
处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算
过程是相同的,不需要额外的硬件电路

移位操作符

注:移位操作符操作的只能是整数。

<<左移操作符

移位规则:左边抛弃、右边补0。被移出左侧(高位)的位将被丢弃,在右侧(低位)空出的位用零填充。每左移一位就相当于乘以二。

#include <stdio.h>

int main() {
    int num = 5;  // 二进制表示: 0101
    int count = 2;
    int result = num << count;  // 左移2位,结果: 10100 (十进制中的20)
    printf("Result: %d\n", result);
    return 0;
}

>>右移操作符

移位规则:有逻辑右移和算术右移。每右移一位就相当于除以2(忽略小数部分)。

  • 逻辑右移:在逻辑右移中,被移出右侧的位(低位)被丢弃,而左侧(高位)空出的位用零填充。逻辑右移通常用于无符号整数的位移操作。
  • 算术右移:在算术右移中,被移出右侧的位同样被丢弃,但左侧空出的位用原数的符号位(最高位)填充。对于正数来说,算术右移的效果等同于逻辑右移,因为正数的符号位是0。但对于负数来说,算术右移可以保持数的符号不变。大多数编译器对于带符号整数的右移操作采用算术右移。

 

#include <stdio.h>

int main() {
    int num = 10;    // 二进制表示: 1010
    int count = 1;
    int result = num >> count;  // 右移1位,结果: 0101 (十进制中的5)
    printf("Result: %d\n", result);
    
    // 对于带符号的负数
    int negativeNum = -10;  // 二进制表示(假设32位系统): 11111111111111111111111111110110
    int negativeResult = negativeNum >> count;  // 算术右移1位,结果仍然是负数
    printf("Negative Result: %d\n", negativeResult);
    
    return 0;
}

警告⚠:对于移位运算符,不要移动负数位,这个是标准未定义的。
 

位操作符

注:他们的操作数必须是整数。

按位与(&)

按位与(&)用于对二进制数进行逐位的逻辑与运算。

具体运算规则:只有当两个对应位都为1时,结果位才为1,否则结果为0。参与运算的数以补码方式出现。

按位与运算在多个方面都有应用,例如:

清零:通过将某些位与0进行按位与操作,可以将这些位的值清零。
掩码操作:通过与一个掩码进行按位与操作,可以提取出指定位置的值。
条件判断:通过与某个条件进行按位与操作,可以判断某个位是否满足条件。

判断奇偶性:if(n%2==0)可以等价成if((n&1)==0),n & 1 会将n的二进制表示与1进行按位与运算。由于1在二进制中只有一位是1(最低位),这个操作实际上只检查n的最低位是否为0。如果最低位为0,那么n就是偶数;如果最低位为1,那么n就是奇数。

此外,按位与运算还可以用于将一个数的某个位置置为0,或者用于设置和合并操作等。

按位或(|)

具体运算规则:只要对应的两个二进位中有一个为1时,结果位就为1。

例如,对于二进制数A=1010和B=1100,进行按位或操作的结果为A | B = 1110。

按位或在多个方面都有广泛的应用,如设置位和合并操作等。通过设置某些位与1进行按位或操作,可以将这些位的值设置为1。此外,通过将多个二进制数进行按位或操作,可以将它们的对应位合并为一个结果。

按位异或(^)

具体运算规则:如果两个相应的二进制位相同,则结果为0,否则为1。

按位异或运算具有一些有用的特性:

1.任何数和自己异或的结果为零。
2.按位异或具有自反性,即对一个数做两次异或运算操作,可以将最后的结果还原。
3.任何数和0做异或值不变,和1异或结果为原操作数取反。
4.按位异或运算满足交换律,可以在不使用中间变量的情况下交换两个数的值。

按位取反(~)

具体运算规则:它对二进制数的每一位执行取反操作,每一位上的1变为0,0变为1

在大多数编程语言中,按位取反操作通常使用特定的操作符(如 ~)来表示。例如,如果我们有一个8位的二进制数 0110 1010,对其执行按位取反操作后,将得到 1001 0101。

需要注意的是,按位取反操作通常是对整数的补码形式进行的。在补码表示法中,最高位(符号位)为1表示负数,为0表示正数或非零。因此,在对一个正数执行按位取反操作时,结果通常是一个负数;反之亦然。

按位取反在编程中有多种应用,例如:

1.快速计算负数:在补码表示法中,一个整数的负数可以通过对该整数执行按位取反后再加1得到。例如,-5 可以表示为 ~5 + 1。
2.位掩码操作:按位取反可以与位掩码结合使用,以选择性地设置或清除二进制数的某些位。
3.检查奇偶性:通过将一个整数与1进行按位与操作,可以快速判断该整数是奇数还是偶数。而在进行此操作之前,有时可能需要先使用按位取反来准备相应的掩码。

位操作符具体应用实例

⼀道变态的面试题:不能创建临时变量(第三个变量),实现两个数的交换。

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d b = %d\n", a, b);
	return 0;
}

代码运行结果:

22771780498e4ba38447c5ceb3e5d8cf.png

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值