c语言移位操作

对于一个位表示为[ [latex]x{w-1},x{w-2},…,x_1,x_0[/latex] ]的操作数x,C表达式x<< k会生成一个值,其位表示为[ [latex]x{w-k-1},x{w-k-2},…,x_1,x_0,0,…,0[/latex] ]
也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。


逻辑右移与算术右移
逻辑右移在左端补k个0,得到的结果是[ [latex]0,…,0,x{w-1},x{w-2},…,xk[/latex] ]
算术右移是在左端补k个最高有效位的值,得到的结果是[ [latex]x
{w-1},…,x{w-1},x{w-1},x_{w-2}…,x_k[/latex] ]


操作

值1

值2

参数x

0110 0011

1001 0101

x << 4

0011 0000

0101 0000

x >> 4(逻辑右移)

0000 0110

0000 1001

x >> 4(算术右移)

0000 0110

1111 1001


几乎所有的编译器都对有符号数(负数)使用算术右移,可Ref