zoukankan      html  css  js  c++  java
  • 关于位移运算

    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;

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/jiangshiyong/p/2650082.html
Copyright © 2011-2022 走看看