c语言中的位移位操作

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118688.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python+opencv图像模板匹配—单模板匹配

    python+opencv图像模板匹配—单模板匹配

    2021年10月6日
    38
  • vscode远程开发python_vscode版本

    vscode远程开发python_vscode版本在大二刚接触linux系统的时候,学校的服务器装的都是有图形界面Ubuntu系统,使用teamviewer远程连接操作很方便,就像多了个电脑一样。可是最近进所里后发现,给分配的服务器只有能使用ssh登录的终端,这让我这个被pycharm的各种功能惯坏了的人十分不爽,不能代码提示补全、不能一眼看到所有文件、不能随心所欲地debug。。。因此我开始了寻找舒适远程开发方法的无用功旅程,在此期间尝试了mobaxterm,vscode和pycharm。最后总结了下各个方法的使用情况。一、Mobaxter…

    2022年8月29日
    3
  • 深入浅出Python——Python基础语法全解

    深入浅出Python——Python基础语法全解前言:Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。文章目录一、Python简介1.了解Python2.Python介绍3.Python特点4.Python发展历史5.Python版本二、Python解释器1.解释器的作用2.解释器的安装三、PyCharm安装与使用1.PyCharm的作用2.PyCharm安装与使用四、注释1.注释的作用2.注释的分类及语法五、变量1.变量的作用2.定义变量2.1标识符2.2命名习惯2.3使用变量2.4认识

    2022年6月24日
    21
  • k8s部署kafka集群「建议收藏」

    k8s部署kafka集群「建议收藏」k8s以StatefulSet方式部署kafka集群:kafka-namespace.yamlapiVersion:v1kind:Namespacemetadata:name:kafkazookeeper-headless.yamlapiVersion:v1kind:Servicemetadata:name:zk-hsnamespace:kafkalabels:app:zkspec:selector:app:zkp

    2022年5月30日
    39
  • noip2018提高组初赛解析_NOIP提高组

    noip2018提高组初赛解析_NOIP提高组题目背景NOIP2012提高组DAY2试题。题目描述H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点。H国的首|都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境城市的每一条路径上都至少有一个检查点,边境城市也可以…

    2022年8月22日
    6
  • ideal 2021 激活码【在线注册码/序列号/破解码】

    ideal 2021 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号