概述
先看如下一段左移右移的代码及其结果:
char leftshift( char i, int n)
{
if (n < 0 )
return - 1 ;
return i << n;
}
char rightshift( char i, int n)
{
if (n < 0 )
return - 1 ;
return i >> n;
}
int main()
{
// leftshift
char a1 = 127 ;
char a2 = - 1 ;
for ( int i = 1 ; i <= 8 ; i ++ )
printf( " %d<<%d = %d;n " , a1, i, leftshift(a1,i));
for (i = 1 ; i <= 8 ; i ++ )
printf( " %d<<%d = %d;n " , a2, i, leftshift(a2,i));
// rightshift
a1 = 127 ;
a2 = - 128 ;
for (i = 1 ; i <= 8 ; i ++ )
printf( " %d>>%d = %d;n " , a1, i, rightshift(a1,i));
for (i = 1 ; i <= 8 ; i ++ )
printf( " %d>>%d = %d;n " , a2, i, rightshift(a2,i));
return 0 ;
}
结果为:
127 << 2 = - 4 ;
127 << 3 = - 8 ;
127 << 4 = - 16 ;
127 << 5 = - 32 ;
127 << 6 = - 64 ;
127 << 7 = - 128 ;
127 << 8 = 0 ;
- 1 << 1 = - 2 ;
- 1 << 2 = - 4 ;
- 1 << 3 = - 8 ;
- 1 << 4 = - 16 ;
- 1 << 5 = - 32 ;
- 1 << 6 = - 64 ;
- 1 << 7 = - 128 ;
- 1 << 8 = 0 ;
127 >> 1 = 63 ;
127 >> 2 = 31 ;
127 >> 3 = 15 ;
127 >> 4 = 7 ;
127 >> 5 = 3 ;
127 >> 6 = 1 ;
127 >> 7 = 0 ;
127 >> 8 = 0 ;
- 128 >> 1 = - 64 ;
- 128 >> 2 = - 32 ;
- 128 >> 3 = - 16 ;
- 128 >> 4 = - 8 ;
- 128 >> 5 = - 4 ;
- 128 >> 6 = - 2 ;
- 128 >> 7 = - 1 ;
- 128 >> 8 = - 1 ;
左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;
低位右移溢出则舍弃该位。
1、127的补码:0111 1111
右移一位: 0011 1111 -> 原码同补码一样 对应十进制:63
右移二位: 0001 1111 -> 原码同补码一样 对应十进制:31
右移三位: 0000 1111 -> 原码同补码一样 对应十进制:15
右移四位: 0000 0111 -> 原码同补码一样 对应十进制:7
右移五位: 0000 0011 -> 原码同补码一样 对应十进制:3
右移六位: 0000 0001 -> 原码同补码一样 对应十进制:1
右移七位: 0000 0000 -> 原码同补码一样 对应十进制:0
右移八位: 0000 0000 -> 原码同补码一样 对应十进制:0
2、-128的补码:1000 0000
右移一位: 1100 0000 -> 这个补码对应的原码为:1100 0000 对应十进制:-64
右移二位: 1110 0000 -> 这个补码对应的原码为:1010 0000 对应十进制:-32
右移三位: 1111 0000 -> 这个补码对应的原码为:1001 0000 对应十进制:-16
右移四位: 1111 1000 -> 这个补码对应的原码为:1000 1000 对应十进制:-8
右移五位: 1111 1100 -> 这个补码对应的原码为:1000 0100 对应十进制:-4
右移六位: 1111 1110 -> 这个补码对应的原码为:1000 0010 对应十进制:-2
右移七位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1
右移八位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1
转载于:https://www.cnblogs.com/yyangblog/archive/2011/01/14/1935656.html
最后
以上就是孤独山水为你收集整理的位运算之左移右移运算之详解的全部内容,希望文章能够帮你解决位运算之左移右移运算之详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复