C语言中的位操作


                                        C语言中的位操作

                                                                                                        作者:孤独草原狼
                   
                                在计算机中数值都是以补码的形式存放和运算的,因此调试看内存的时候内存中看到的都是补码。
                       所以位操所的时候要先转化成补码才能运算。

                       原码和补码的相互转换:
                       在补码方案中: 1.最高位为1,表示负数;
                                                  2.正数的补码取反加1后是负数的补码,负数的补码取反加1后为其
                                                   绝对值。PS:这里所说的取反是对整个位取反,包括符号位。
        
                      几种位操作的用法如下:
                                     
#include <stdlib.h>
//在补码方案中,正数的补码取反加1后
//为其对应的负数的补码,负数的补码取反加1后
//为其绝对值。PS:这里所说的取反是对整个位都
//取反,包括符号位。
#include <stdio.h>
int main()
{
    #if 0
    /**< & 运算 (与) */
    /**< 计算机中数字是以补码形式存放的,因此在内存中
      a和b是以如下方式存储的(可以看内存)
      a:ff ff ff fb
      b:00 00 00 06
     */
    int a = -5, b = 6, c;
    c = a & b;
    printf("%d\n", c);
    return 0;
    #endif

    #if 0
    /**< | 运算 (或)*/
    /**< 同样使用上面的例子*/
    int a = -5, b = 6, c;
    c = a | b;
    printf("%d\n", c);
    return 0;
    #endif // 1

    #if 0
    /**< ~ 运算 (非) */
    /**<
      a:ff ff ff fe
     */
    int a = -2, b;
    b = ~a;
    printf("%d\n", b);
    return 0;
    #endif // 1

    #if 0
    /**< ^ 运算 (异或) */
    char a, b, c;
    a = 4, b = 3;
    c = a ^ b;
    printf("%d", c);
    return 0;
    #endif // 1

    #if 1
    /**< << 运算 (左移) */
    /**<
      a: ff 左移一位后变成了 fe(补码),
      转化成原码就是 1000 0010 == -2
      ***左移运算比较简单,只是右边空出来的补0就好了。
     */
    char a, b;
    a = -1;
    b = a << 1;
    printf("%d\n", b);
    return 0;
    #endif // 1

    #if 0
    /**< >> 运算(右移) */
    /**<
      ***对于有符号数用-1填补,
         对于无符号数用0填补。
     */
    char a, b;
    a = -3, b = 1;
    printf("%d\n%d\n", a >> 1, b >> 1);
    return 0;
    #endif // 1
}<span style="color:#3333ff;">
</span>

 
                                      

posted on 2015-07-05 18:13  CodeNutter  阅读(502)  评论(0编辑  收藏  举报

导航