首先谈一下 什么是为运算
C语言是为描述系统设计的,因此它应该具有汇编语言所以完成的一些功能。C语言既有高级语言的特点,又具有低级语言的功能。因而具有广泛的用途和很强的生命力。
运算符 | 含义 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
注意:
(1)位运算符中除 ~ 外,均为二目运算符,即要求出侧各有一个运算量
(2)运算只能是整型或字符型的数据,不能为实型数据 (ps: 下边)。
原码, 反码, 补码 详解 这里十分详细不再赘述;
[+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补 |
在计算机的存储单元中,使用的整数的补码形式进行存放。计算方式 例:
编号 | 数值 | 原码 | 反码 | 补码 | 运算 | 结果(补码) | 十进制 |
① | 3 | 0000,0011 | 0000,0011 | 0000,0011 | ①&② | 0000,0001 | 1 |
② | 5 | 0000,0101 | 0000,0101 | 0000,0101 | ①|② | 0000,0111 | 7 |
③ | -5 | 1000,1001 | 1111,0110 | 1111,0111 | ①&③ | 0000,0011 | 3 |
④ | -1 | 1000,0001 | 1111,11110 | 1111,1111 | ③&④ | 1111,1011 | -5 |
在这里我们有一个规律 补码的补码是原码。
异或运算符 ^
异或运算符 ^ 也称 XOR 运算符。它的规则是若参加运算的两个二进位同号,则结果为0,异号则为1。
编号 | 数值 | 原码 | 反码 | 补码 | 运算 | 结果(补码) | 十进制 |
① | 3 | 0000,0011 | 0000,0011 | 0000,0011 | ①^② | 0000,0110 | 6 |
② | 5 | 0000,0101 | 0000,0101 | 0000,0101 | |||
③ | -5 | 1000,1001 | 1111,0110 | 1111,1011 | ①^③ | 1111, 1000 | -8 |
④ | -1 | 1000,0001 | 1111,11110 | 1111,1111 | ③^④ | 0000, 0100 | 4 |
异或的一个小技巧:a^b^a ==b;
取反运算符 ~
~是一个头单目运算符,用来对一个二进制按位取反,即将 0 变 1,1变 0。
编号 | 数值 | 原码 | 取反 |
① | 3 | 0000,0011 | 1111,1100 |
~运算符的优先级别比算术运算符(ps:优先级问题可参考该分类下 优先级问题的博文),例如:~a & b,先进行 ~a 然后进行 & 运算。
左移运算符 <<
编号 | 数值 | 原码 | 结果 |
① | 3 | 0000,0011 | 0000,1100 |
左移的特征:将二进制数左移 2 位,右侧补 0 如若最高位左移后溢出,舍弃不起作用。
例: 014(==12 (十进制))<<2,结果为 48 (十进制)
右移运算符(>>)
编号 | 数值 | 原码 | 结果 |
① | 17 | 0001,0001 | 0000,0100(4)(其实是不确定的) |
- 右移运算将一个位串信息向右移指定的位,右端移出的位的信息被丢弃。
- 对无符号数据,右移时,左端空出的位用0补充。对于带符号的数据,如果移位前符号位为0(正数),则左端也是用0 补充;
- 如果移位前符号位为1(负数),则左端用0或用1补充,取决于计算机系统。
- 对于负数右移,称用0 补充的系统为“逻辑右移”,用1补充的系统为“算术右移”。
四种运算的作用
符号 | 作用 | |
& | 与0相与可清零 | 与1相与可保留原值 |
| | 与0相或可保留原值
|
与1相或可全部设为1
|
^ | 与0异或保留原值 | 与1异或比特值反转 |
shi | 在二进制数运算中,在信息没有因移动而丢失的情况下,每左移1位相当于乘2。如4 << 2,结果为16。 | |
shr | 暂时不明确 |