• 关于位移运算


    C语言里所有的位运算都是指二进制数的位运算。即使输入的是十进制的数,在内存中也是

    存储为二进制形式。

    1.

    左移运算符“< <”用法:

    (左移运算是将一个二进制的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0)

    格式是:a<<m, a和m必须是整型表达式,要求m>=0。

    功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0。

    右移运算符“> >”用法:

    (右移运算是按指定移动位数向右移动,移出位被丢弃,左边移动的空位一律补0)

    格式是:a>>m, a和m必须是整型表达式,要求m>=0。

    功能:将整型数a按二进制位向右移动m位,高位移出后,低位补0。

    对于无符号数,进行右移时,左边空出的部分补0.

    对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;

    而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。

    Turbo C和很多系统规定为补1。

    2.

     C语言8进制移位计算


    八进制数177777>>2

    无符号数结果是037777

    (例如无符号的177777转换成二进制是001 111 111 111 111 111,右移两位是

    000 011 111 111 111 111,再转换成八进制就是037777)

    有符号数结果是637777

    (有符号的时候,右移两位补充1,110 011 111 111 111 111,转换成八进制就是637777)

    3.

    C语言中,移位表示什么?有什么用?

    比较浅显的说来,左移n位就是乘以2的n次方,右移n位就是除以2的n次方,具体细节如下:

    先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符,例如:

    int i = 1;

    i = i<<2;//把i里的值左移2位

    (也就是说,1的二进制是0000 0001,左移2位之后变成0000 0100,也就是十进制的4,所以

     左移1位就是乘以2,那么左移n位就是乘以2的n次方)(有符号数不完全适用,因为左移有可能导致符号变化)

    需要注意的一个问题是:int类型最左端的符号位和移出去的情况,我们知道,int 是有符号的整型数,

    最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

     int i = 0x40000000;//16进制的4000 0000,为二进制的0100 0000 0000 0000 0000 0000 0000 0000

    //4000 0000共八位,故用二进制表示为32位。

    i = i<<1;

    那么,i在左移1位之后就会变成0x40000000,也就是二进制的1000 0000 0000 0000 0000 0000 0000 0000

    待补充右移运算。

    因为位移运算的速度比乘法快很多,所以在处理数据的乘法或除法运算数字(当要乘或除的数字是2的次方时候,采用

    位移运算可以获得较快的运算速度,提高程序的运行效率)。

    4.与运算 &:

       两个都为1,才为1;

       或运算 |:

       一个为1,就为1;

       异或运算 ^:

       同为0,异为1;

       (异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:

         0异或0=0,1异或  0=1,0异或1=1,1异或1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位);


    运算规则如下:

    0&0 = 0;    0|0= 0;  0^0 = 0;

    0&1 = 0;    0|1= 1;  0^1 = 1;

    1&0 = 0;    1|0= 1;  1^0 = 1;

    1&1 = 1;    1|1= 1;  1^1 = 0;

  • 相关阅读:
    5、流程控制
    4、字典和元祖
    3、列表操作
    2、字符串和数据类型
    1.标识符练习
    使用xpath提取页面所有a标签的href属性值
    网页提取所有邮箱
    正则表达式
    提取包含QQ的文本为QQ邮箱
    python继承小demo
  • 原文地址:https://www.cnblogs.com/jiangshiyong/p/2650082.html
Copyright © 2020-2023  润新知