问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言位与移位操作符详解

创作时间:
作者:
@小白创作中心

C语言位与移位操作符详解

引用
1
来源
1.
https://cloud.tencent.com/developer/article/2396447

位与移位操作符是C语言编程中的重要概念,掌握这些操作符的使用方法对于编写高效、优化的代码至关重要。本文将从二进制基础知识开始,逐步深入讲解原码、反码、补码的概念,以及移位操作符和位操作符的具体使用方法。

1. 二进制和进制转换

在计算机科学中,我们经常需要处理不同进制的数值。2进制、8进制、10进制、16进制是数值的不同表示形式而已。

例如,数值15的各种进制表示形式如下:

  • 二进制:1111
  • 八进制:17
  • 十进制:15
  • 十六进制:F

① 十进制:生活中最常用

  • 逢十进一
  • 数字每一位由0~9中的数字组成

② 二进制:计算机中使用的,每个数字称为一个比特

  • 逢二进一
  • 数字每一位由0~1中的数字组成

③ 八进制、十六进制也如上

④ 二进制转十进制

各种进制的每一位都有相对应的权重。例如,十进制中123为什么是这个值呢?

十进制的位:1 2 3
权重:
求值:1 * 100 + 2 * 10 + 3 * 1 = 123

10^{2}
我们可以看到十进制从右往左个、十、百...位权重依次是
10^{0}

10^{1}

10^{2}
...

2进制和10进制是类似的,只不过2进制的每一位的权重,从右向左是:
2^{0}

2^{1}

2^{2}
...

例如:
二进制的位:1 1 0
权重:
求值:1 * 4 + 1 * 2 + 0 * 1 = 6

⑥ 二进制转八进制

8进制的数字每一位是 07 的,07的数字,各自写成2进制,最多有 3个2进制位 就足够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。

例如:

⑦ 二进制转十六进制

16进制的数字每一位是 09,a ~f 的,09,a ~f的数字,各自写成2进制,最多有4个2进制位就足够了,比如 f 的二进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位,剩余不够4个二进制位的直接换算。

例如:2进制的01101011,换成16进制: 0x6b ,16进制表示的时候前面加0x

2. 原码、反码、补码

  • 整数的二进制表示方法有三种:原码、反码、补码
  • 有符号整数三种表示方式均有 符号位与 数值位两部分,在二进制序列中 最高的一位是符号位,其余的是数值位;
  • 符号位的0表示“ 正”,1表示“ 负”;
  • 原码:直接将数据翻译成二进制的形式就可以
  • 例:10 翻译成二进制就是 1010 再根据数据开辟的内存空间补充0或1就可(正数符号位 即第一位补0负数符号位补1,其余都补0)
  • int 10就是开辟了4个字节有32个比特位即00000000 00000000 00000000 00001010为 二进制表示
  • int -10的二进制原码即为10000000 00000000 00000000 00001010
  • 反码:将原码的符号位不变其余按位取反
  • 例:int -10反码:11111111 111111111 11111111 11110101
  • 补码:反码+1即可
  • 例:int -10补码:11111111 11111111 11111111 11110110
  • 注意:
    1. 正数的原码、反码、补码相同
    2. 对于整型来说:数据在内存中存放的是补码
  • 存放补码的原因在于:
  • 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算 过程是相同的,不需要额外的硬件电路.

3. 移位操作符(对于数值的二进制操作)

  • << 左移操作符
  • 右移操作符

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

① 左移操作符<<

规则:左边抛弃,右边补零

② 右移操作符>>

规则:

首先右移运算分两种:

  1. 逻辑 右移:左边用0填充,右边丢弃
  2. 算术 右移:左边用原该值的符号位填充,右边丢弃

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

例如:

int num = 10;
num>>-1;//error

4. 位操作符:&、|、^、~

  • & //按位与 将两操作数二进制每一位对比同时为1时结果为1,否则为0
  • | //按位或 同时为0时为0,其余为1
  • ^ //按位异或 相同为0,否则为1
  • ~ //按位取反 同反码的运算

注:它们的操作数必须是整数,负数用二进制的补码进行运算

例如:

#include <stdio.h>
int main()
{
 int num1 = -3;
 int num2 = 5;
 printf("按位与&:%d\n", num1 & num2);
 printf("按位或|:%d\n", num1 | num2);
 printf("按位异或^:%d\n", num1 ^ num2);
 printf("按位取反~:%d\n", ~0);
 return 0;
}

结果如下:

① 按位与&

-3取其补码
按位与同数学中的逻辑运算与,同真才为真(两个都是1才为1),其余为假(0);

② 按位或|

按位或类似于数学中逻辑与算符或:
只要有一个真则为真其余为假(只要有一个1则为1,其余为0)

③ 按位异或^

相异为真(01则为1,其余为0)

④ 按位取反~

取相反值就行

5. 结语

位与移位操作符是C语言学习中的一个难点,其关键在于对于二进制的了解与使用,熟悉各种操作符的使用规则,以上就是今天学习的内容啦~

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号