美文网首页十天学会C语言程序员
C语言day06-05位运算02-左移右移

C语言day06-05位运算02-左移右移

作者: liyuhong165 | 来源:发表于2016-05-01 00:12 被阅读67次

pragma mark 位运算02-左移右移

pragma mark 概念

/**
 *  
    左移 <<
    右移 >>
 应用场景:如果想让某一个数乘以2的多少次幂,或者除以2的多少次幂,最高效的运算方式就是左移右移

 */

pragma mark 代码

#include <stdio.h>
int main()
{
#pragma mark 左移
    /**
     左移 : <<
     9 << 1 ?
     9 << 2 ?
     规律: 左移就是用左移动的数乘以2的移动次幂
     例如:
     9 << 1 == 9 * 2(1) == 18
     9 << 2 == 9 * 2(2) == 36
     
     注意点:
     由于左移运算,被移动的数的最高位会被抛弃(移除),所以左移有可能会改变一个数的正负性
     
     0000 0000 0000 0000 0000 0000 0000 1001    // 用于对比
     000 0000 0000 0000 0000 0000 0000 10010    // 16 + 2 = 18
     
     0000 0000 0000 0000 0000 0000 0000 1001    // 用于对比
     00 0000 0000 0000 0000 0000 0000 100100    // 32 + 4 = 36

     */
    
    printf("%i\n",9<<2);
    
#pragma mark 右移
    /**
     右移: >>
     9 >> 1 = ?
     9 >> 2 = ?
     规律: 右移就是右移动的数 除以 2的移动次幂
     9 >> 1 == 9/ 2(1) == 4
     9 >> 2 == 9/ 2(2) == 2
     
     0000 0000 0000 0000 0000 0000 0000 1001    // 用于对比
     0 0000 0000 0000 0000 0000 0000 0000 100   // 4
     
     0000 0000 0000 0000 0000 0000 0000 1001    // 用于对比
     0 00000 0000 0000 0000 0000 0000 0000 10   // 2

     -9 >> 1
     1000 0000 0000 0000 0000 0000 0000 1001    // 用于对比
     1000 0000 0000 0000 0000 0000 0000 1001   // 原码
     1111 1111 1111 1111 1111 1111 1111 0110   // 反码
     1111 1111 1111 1111 1111 1111 1111 0111   // 补码 最高位的第二位 补1 砍掉最后一位
     11111 1111 1111 1111 1111 1111 1111 011   // 右移一位
     00000 0000 0000 0000 0000 0000 0000 001   // -1
     ----------------------------------------
     11111 1111 1111 1111 1111 1111 1111 010   // 反码
     10000 0000 0000 0000 0000 0000 0000 101   // 原码 1 + 4 = 5 最高位是 1 所以为-5
     
     注意:负数的左移右移是补码在移动,因为负数都是以补码的形式存储在内存中的

     应用场景:如果想让某一个数乘以2的多少次幂,或者除以2的多少次幂,最高效的运算方式就是左移右移
     */

    printf("%i\n",-9 >> 1);
    return 0;
}

相关文章

  • C语言day06-05位运算02-左移右移

    pragma mark 位运算02-左移右移 pragma mark 概念 pragma mark 代码

  • C语言左移和右移

    C语言中左移表示左移运算符,就是把最高位丢弃掉然后在最低位补0;而C语言中的右移就是右移运算法,与左移是相反的,它...

  • 位运算

    位运算小结(按位与、按位或、按位异或、取反、左移、右移) 位运算不管是在Java语言,还是在C语言中,或者其他语言...

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

  • 第06天C语言(00):笔记总结

    01-进制转换-基本概念 02-进制转换 03-原码补码反码 04-位运算 05-左移右移 06-位运算-练习1 ...

  • C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左

    C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么?答案:右移,除以2 ...

  • iOS 枚举|结构体

    iOS 运算符[/p/1eaa9e021fac] 左移<<右移>>按位或︳按位并&按位取反~按位异或^ C语言用法...

  • 位运算

    Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或...

  • OC中的位运算

    OC中的位运算和C/C++里的是一样的,&(按位与),| (按位或),~ (按位取反),<<(左移) ,>>(右移...

  • C语言位运算符及常见用法

    一、位运算符C语言提供了六种位运算符:# & 按位与| 按位或^ 按位异或~ 取反<< 左移 >>右移 ...

网友评论

    本文标题:C语言day06-05位运算02-左移右移

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