对于一个位表示为[ [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