移位:逻辑右移、算数右移

文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。

在程序设计中,移位(shift)是位操作运算符的一种。在二进制的基础上,使用移位操作可以完成乘法等运算。

左移

其中,左移($<<$)操作都是在右边添 $0$,

例如,$3<<2$,可以视作

0x00000011 << 2 $\rightarrow$ 0x000011[0][0] (12)

相当于做了两次 $\times 2$ 的乘法。

右移

右移操作分为逻辑右移算术右移,也记作无符号右移($>>>$)和带符号右移 ($>>$)。

C 语言中默认进行的是算术右移,即保持符号位。 若要执行逻辑右移,可将当前数强制转换为无符号数。

类似地,右移操作相当于做了 $2^n$ 的除法。

在该区分下,以 $-5$ (0xfffffffb) 为例,

  • 算数右移,0xfffffffb >> 2 $\rightarrow$ 0xfffffffe
  • 逻辑右移,0xfffffffb >>> 2 $\rightarrow$ 0x3ffffffe

Codes

测试代码

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
int a = -5;
int sar = a >> 2;
int slr = (unsigned)a >> 2;

// sar: 0xfffffffe, slr: 0x3ffffffe
printf("sar: 0x%x, slr: 0x%x\n", sar, slr);
}

你学废了吗?

都看到这儿了,不如关注每日推送的“科文路”、互动起来~

移位:逻辑右移、算数右移

https://xlindo.com/kewenlu2022/posts/bed7e1bb/

Author

xlindo

Posted on

2022-05-03

Updated on

2023-05-10

Licensed under

Comments