先要了解一下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

 
0

c语言中的位移位操作的更多相关文章

  1. 关于c语言中负数位移位操作的漫谈

    近期有个朋友在程序中使用了对16进制数做负数移位(编译器是gcc),本人最次产生好奇.所以研究了一些. 对一个数做负数位移位的操作是不规范的,可是是可行的. 详细样例: char tmp = 0x10 ...

  2. 单片机的C语言中位操作用法2

    单片机的C语言中位操作用法 在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大 的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点. 这也 ...

  3. C语言中的运算符

    1. 在C语言中运算符包括:算术运算符.关系运算符.赋值运算符.逻辑运算符 2.用运算符把变量.常量连接起来的式子就是表达式 3.我们阅读一个表达式,从表达式的功能和表达式的值来看 4. 算术运算符和 ...

  4. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  5. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

  6. C语言中 移位操作运算

    移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...

  7. c语言中的左移和右移

    先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1;i = i << 2;  //把i里的值左移2位 也就是说,1的2进制是00 ...

  8. C语言中的按位移动及其简单引用

    C语言中的按位移动及其简单应用 在C语言中按位左移用”<<”表示,按位右移用”>>”表示. 按位左移和按位右移运算经常被用来替换乘二和除二运算,但是要注意,这两者之间并不完全等 ...

  9. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

随机推荐

  1. OpenStack 界面开发中response.body的中文编码问题

    Contents [hide] 1 问题的引入= 1.1 解决办法 2 用户限制输入中文 3 不限制用户输入,呈现上修改 问题的引入= G在我们创建虚拟机的时候,会设置虚拟机的名称,描述,如果没有限制 ...

  2. Android扫描文件

    扫描文件及文件夹 package com.bwie.demo; import java.io.File; import java.io.FileFilter; import java.util.Arr ...

  3. autohotkey-【GUI】Switch between Windows of the Same Application

    下面给出了ahk的脚本,但我需要GUI http://superuser.com/questions/435602/shortcut-in-windows-7-to-switch-between-sa ...

  4. Yahoo! s4和Twitter storm的粗略比较

  5. SQLITE3 使用总结

    转自: http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉 ...

  6. SDUT 2408:Pick apples

    Pick apples Time Limit: 1000MS Memory limit: 165536K 题目描述 Once ago, there is a mystery yard which on ...

  7. 2015-11-04 asp.net 弹出式日历控件 选择日期 Calendar控件

    html代码: <%@ Page Language="C#" CodeFile="calendar.aspx.cs" Inherits="cal ...

  8. Pipe(点积叉积的应用POJ1039)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9723   Accepted: 2964 Description ...

  9. Fibonacci Again 分类: HDU 2015-06-26 11:05 13人阅读 评论(0) 收藏

    Fibonacci Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  10. Who's in the Middle 分类: POJ 2015-06-12 19:45 11人阅读 评论(0) 收藏

    Who's in the Middle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34155   Accepted: 1 ...