zoukankan      html  css  js  c++  java
  • c语言中的位移位操作

    先要了解一下C语言里全部的位运算都是指二进制数的位运算。即使输入的是十进制的数,在内存中也是存储为二进制形式。 
    “<<”使用方法: 
    格式是:a<<m,a和m必须是整型表达式,要求m>=0。 
    功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0。 
    “>>”使用方法: 
    格式是:a>>m,a和m必须是整型表达式,要求m>=0。 
    功能:将整型数a按二进制位向右移动m位,低位移出后,高位补0
    
    

    C语言中的移位操作,内容不多。只是有些地方你不注意,就疏忽了。
    闲话少说,先做两个小题先。
    (1)unsigned char x=3;
    x<<1是多少?x>>1是多少?
    (2)char x=3;
    x<<1是多少?x>>1是多少?
    (3)char x=-3;
    x<<1是多少?x>>1是多少?

    3写成二进制数是00000011;-3写成二进制数是(补码)11111101。
    程序运行的时候,操作的是数值的编码表示,也就是数值在内存中的二进制表示。比方说,
    程序取-3的时候,就去取11111101。

    (1)对无符号数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成
    00000110,所以结果是6;x>>1往右边移一位,因为是无符号数,所以逻辑右移,最右边一位移掉,
    最左边移进来的位补零,变成00000001,所以结果是1。
    (2)对于有符号数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成
    00000110,所以结果是6;x>>1往右边移一位,因为是有符号数,可能发生逻辑右移,也可能发生算术右移
    ,这一点,C标准并没有明白地指定是使用逻辑右移还是算术右移。但大多数的机器都使用算术右移,变成
    00000001,所以结果还是1。可是请注意,这仅仅是说大多数的机器是这种,你敢保证自己
    不会碰到特殊情况吗?
    (3)对于有符号数-3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成
    11111010,结果是-6。往右移一位,因为是有符号数,可能发生逻辑右移,也可能发生算术右移。
    大多数机器使用算术右移,变成11111110,结果是-2。

    总结:左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;
    而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。

    附打印内存中字节编码的代码:
    void print_char(char x)
    {
      unsigned char * bp=(unsigned char *)&x;
      int size=sizeof(x);
      for(int i=0; i<size; i++)
           printf("%.2x", bp[i]);
      printf("/n");
    }
    能够自己实践实践阿。

    引用自:http://blog.chinaunix.net/u1/33888/showart_334911.html

  • 相关阅读:
    通讯录封装实现
    简单通讯录的实现 main..h .m文件全部
    iOS 开发 OC编程 字典和集合 排序方法
    iOS 开发 OC编程 数组冒泡排序.图书管理
    iOS 开发 OC编程 属性和字符串练习
    iOS 开发 OC编程 属性和字符串
    iOS 开发 OC编程 便利构造器以及初始化方法
    iOS 开发 OC编程 方法的书写
    IOS 开发 OC编程 类和对象
    iOS 开发 c语言阶段考试题
  • 原文地址:https://www.cnblogs.com/blfshiye/p/3787576.html
Copyright © 2011-2022 走看看