位移运算

本文详细介绍了位运算符的使用方法及技巧,包括左移、右移、无符号右移等运算符的操作方式,并通过实例解释了这些运算符如何在计算机内部实现数值的快速运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 移位操作符***用处:     最快的运算是位运算。

<< 左移

>> 右移

>>> 无符号右移

 

位运算符

运算符

运算

范例

<<

左移

3 << 2 = 12 --> 3*2*2=12

>>

右移

3 >> 1 = 1  --> 3/2=1

>>>

无符号右移

3 >>> 1 = 1 --> 3/2=1

&

与运算

6 & 3 = 2

|

或运算

6 | 3 = 7

^

异或运算

6 ^ 3 = 5

~

反码

~6 = -7

 

位运算符的细节

<<

空位补0,被移除的高位丢弃,空缺位补0

>>

被移位的二进制最高位是0,右移后,空缺位补0

最高位是1,空缺位补1

>>>

被移位二进制最高位无论是0或者是1,空缺位都用0补。

&

二进制位进行&运算,只有1&1时结果是1,否则是0;

|

二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;

^

任何相同二进制位进行 ^ 运算,结果是01^1=0 , 0^0=0

 

不相同二进制位 ^ 运算结果是11^0=1 , 0^1=1

 

技巧:可以理解为二进制1就是true0就是false

 

案例:

1、左移 (算术移位)

3<< 2 是如何在计算机里是实现的?

首先将3转换为2进制, 

00000000

00000000

00000000

00000011

3 的二进制

00000000

00000000

00000000

000011

左移2位,砍掉高位

0000 0000

0000 0000

0000 0000

0000 1100

低位补0

结果是12,所以3<<2 =12;

结论:左移就相当于乘以2的位移个数次幂.

  

2、右移

6>>2

00000000

00000000

00000000

00000110

6的二进制

000000

00000000

00000000

00000001

右移10被砍掉

00000000

00000000

00000000

00000001

高位补0

结果是1,所以6>>2 =1; 

 

结论一个数往左移越移越大,往右边移越来越小.

推论

3<<2=12;  3<<1=6 ;  3<<3=24;

3*4=12 ;  3*2=6;    3*8=24;

3*22=12;   3*21=6    3*23 =24;

结论往左移几位就是乘以2的几次幂。

右移规律

6>>2=1  ;6>>1=3 ;

6/4=1   ; 6/2=3 ;

右移两位就是除以 22次方,右移一位就是除以 2的一次方。

总结 >> 是除以2的移动位数次幂

     << 是乘以2的移动位数次幂

***用处:     最快的运算是位运算。

 

练习:最有效率的方式算出2乘以8等于几?

2<<<   2左移3位

 3、无符号右移 (逻辑移位)

通过演示发现右移时高位就空了出来, >> 右移时高位补什么要按照原有 数据的最高位来决定。

1111-1111 1111-1111 1111-1111 1111-1010    -6>>2

1111-1111 1111-1111 1111-1111 1111-0010    

 最高位补什么要看原有最高位是什么

那么使用>> 后原来是最高位1 的那么空出来的最高位还是1 的,是0的还是0

如果使用>>> 无论最高位是0还是1 空余最高位都拿0 ,这就是无符号右移。

1111-1111 1111-1111 1111-1111 1111-1010    -6>>>2

001111-1111 1111-1111 1111-1111 1111-10    

结果是;1073741822 

### 位移运算的定义与用法 #### 位移运算的定义 位移运算是计算机编程中的一种基本操作,主要通过改变二进制数的位置来实现特定的功能。在 C 语言或其他编程语言中,位移运算符包括左移(`<<`)和右移(`>>`)。左移运算相当于将数值乘以 2 的幂次方,而右移运算则相当于除以 2 的幂次方[^1]。 #### 位移运算的用法 位移运算广泛应用于性能优化、底层开发以及硬件操作等领域。以下是其具体应用: 1. **快速乘法与除法** 在需要对整数进行乘以或除以 2 的幂次方时,位移运算是一种高效的方式。例如: ```c int multiplyBy8 = num << 3; // 等效于 num * 8 int divideBy4 = num >> 2; // 等效于 num / 4 ``` 这种方法比传统的乘法或除法运算更快,尤其是在嵌入式系统中,效率尤为重要[^2]。 2. **生成位掩码** 位移运算常用于生成位掩码,以便控制或操作特定位。例如: ```c int mask = 1 << 3; // 生成一个第三位为 1 的掩码,值为 00001000 (8) ``` 通过这种方式,可以方便地设置或清除寄存器中的某一位[^3]。 3. **符号扩展处理** 对于有符号数,右移运算会保持符号位不变。这在处理负数时非常有用。例如: ```c int x = -16; int y = x >> 2; // 结果仍然是负数,按符号位扩展 ``` 这种特性使得算术右移在处理有符号整数时更加可靠。 4. **硬件操作与协议实现** 在嵌入式系统中,位移运算常用于操作寄存器、设备控制、设置或读取特定位等场景。此外,它还广泛应用于 CRC 校验、加密算法、图像处理等领域。 ```c // 示例:使用位移运算实现简单的循环缓冲区 #define BUFFER_SIZE 8 int buffer[BUFFER_SIZE]; int head = 0; void enqueue(int value) { buffer[head] = value; head = (head + 1) & (BUFFER_SIZE - 1); // 使用位移运算实现循环索引 } ``` #### 总结 位移运算不仅能够实现高效的数学运算,还在底层开发和硬件操作中发挥重要作用。通过合理使用位移运算,可以显著提升程序的性能和效率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值