美文网首页
C 语言的移位运算

C 语言的移位运算

作者: 永远保持一颗进取心 | 来源:发表于2017-04-19 14:53 被阅读232次

    C 语言的移位运算

    参考博客:http://blog.csdn.net/e3399/article/details/7526230
    如有错误,欢迎指正!

    结论:左移是逻辑移位,右移是算术移位; 也就是说:左移补齐0,右移补齐符号位。

    • 推论1:正数左移可能为负数;正数右移一定为非负数
    • 推论2:负数左移可能为正数;负数右移一定为负数
    • 推论3:在不改变符号位的情况下,左移相当于乘以2,右移相当于除以2(整数运算)

    验证都是比较简单,读者可以自己进行更多数据的验证

    验证推论1:正数左移可能为负数;正数右移一定为非负数
    int main(int argc, char *argv[]) {
        //验证 推论1
        int i = 0x40000001;
        int j = i << 1; 
        printf("i = %d, hex = %x\n", i, i);
        printf("j = %d, hex = %x\n", j, j);
        i = 0x03;
        j = i >> 1;
        printf("i = %d, hex = %x\n", i, i);
        printf("j = %d, hex = %x\n", j, j);
        return 0;
    }; 
    
    输出:
    i = 1073741825, hex = 40000001
    j = -2147483646, hex = 80000002
    i = 3, hex = 3
    j = 1, hex = 1
    
    分析:
    i = 1073741825 大于 0,左移 1 位得 j = -2147483646 小于0;验证正数左移可能为负数。
    i = 3 大于 0,右移 1 位得 j = 1 大于0;验证正数右移一定为非负数(可能为零)。
    
    验证推论2:负数左移可能为正数;负数右移一定为负数
    int main(int argc, char *argv[]) {
        //验证 推论2
        int i = 0x80000001;
        int j = i << 1;
        printf("i = %d, hex = %x\n", i, i);
        printf("j = %d, hex = %x\n", j, j);
        j = i >> 1;
        printf("i = %d, hex = %x\n", i, i);
        printf("j = %d, hex = %x\n", j, j);
        return 0;
    };
    
    输出:
    i = -2147483647, hex = 80000001
    j = 2, hex = 2
    i = -2147483647, hex = 80000001
    j = -1073741824, hex = c0000000
    
    分析:
    i = -2147483647 左移 1 位得 j = 2;验证:负数左移可能为正数;
    i = -2147483647 右移 1 位得 j = -1073741824;验证:负数右移一定为负数
    
    验证推论3:在不改变符号位的情况下,左移相当于乘以2,右移相当于除以2(整数运算)
    情况1:当 i 是正数的情况下
    int main(int argc, char *argv[]) {
        //验证 推论3 当 i 是正数的情况
        int i = 0x20000001;
        printf("i = %d, hex = %x\n", i, i);
        
        int j = i << 1; //左移 1 位
        printf("j = %d, hex = %x\n", j, j);
        
        j = i >> 1; // 右移 1 位
        printf("j = %d, hex = %x\n", j, j);
        
        
        j = i << 2; // 左移而且改变了符号位
        printf("j = %d, hex = %x\n", j, j);
    };
    
    输出:
    i = 536870913, hex = 20000001
    j = 1073741826, hex = 40000002
    j = 268435456, hex = 10000000
    j = -2147483644, hex = 80000004
    
    可以看出,左移 1 位 相当于乘以 2,右移 1 位相当于除以 2;当时一旦改变了符号位,就不成立了。
    
    
    情况2:当 i 是负数的情况下
    int main(int argc, char *argv[]) {
        //验证 推论3 当 i 是正数的情况
        int i = 0xdffffffb;
        printf("i = %d, hex = %x\n", i, i);
        
        int j = i << 1; //左移 1 位
        printf("j = %d, hex = %x\n", j, j);
        
        j = i >> 1; // 右移 1 位
        printf("j = %d, hex = %x\n", j, j);
        
        
        j = i << 2; // 左移 2 位, 该表了符号位
        printf("j = %d, hex = %x\n", j, j);
    };
    
    输出:
    i = -536870917, hex = dffffffb
    j = -1073741834, hex = bffffff6
    j = -268435459, hex = effffffd
    j = 2147483628, hex = 7fffffec
    
    可以看出,左移 1 位 相当于乘以 2,右移 1 位相当于除以 2;当时一旦改变了符号位,就不成立了。
    

    相关文章

      网友评论

          本文标题:C 语言的移位运算

          本文链接:https://www.haomeiwen.com/subject/wrfhzttx.html