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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Eclipse SVN使用问题之 Attempted to beginRule

    Eclipse SVN使用问题之 Attempted to beginRule

    2021年5月8日
    151
  • 【动画教程】真封神南极服务端2.52架设第三集[通俗易懂]

    【动画教程】真封神南极服务端2.52架设第三集[通俗易懂]官方网站www.zfs2014.com动画名称:真封神南极服务端2.52架设第三集主讲人:diablo2208教程下载地址:http://pan.baidu.com/s/1c0GfyMk

    2022年7月24日
    10
  • 关于this指针

    关于this指针一个类的对象中实际只包含了该对象的数据成员信息,当我们创建了多个类的对象时,使对象1调用该类的成员函数,为什么可以改变对象1中的信息,而不去设置其他对象的信息?成员函数在类中只有一份,所有该类的对象共同使用,编译器是如何识别并处理的呢?编译器识别一个类分为三步:1.识别类的类名2.识别类的成员变量3.识别类的成员函数并对成员函数进行修改修改方式:成员函数有一个隐藏…

    2022年5月16日
    51
  • RegisterStartupScript 使用误区

    RegisterStartupScript 使用误区在【孟子E章】专栏里,我曾经发表了一篇《ASP.NET2.0中CSS失效的问题总结》(地址是:http://blog.csdn.net/net_lover/archive/2007/08/27/1760521.aspx)的文章。有些人不知道使用RegisterStartupScript输出文本(非脚本内容),只能使用Response.Write的方法。这其实是对RegisterStartupSc…

    2022年7月20日
    17
  • influxdb基本操作_一个数据库只有一个内模式

    influxdb基本操作_一个数据库只有一个内模式安装aptinstallinfluxdbinfluxdb-client<ip>:8083#web<ip>:8086#httpapi复制代码influxDB中独有的一些概念Point由时间戳(time)、数据(field)和标签(tags)组成time:每条数据记录的时间,也是数据库自动生成的主索引fields:各种记录的值…

    2025年6月20日
    4
  • 中文短文本分类实例六-DCNN(A Convolutional Neural Network for Modelling Sentences)「建议收藏」

    中文短文本分类实例六-DCNN(A Convolutional Neural Network for Modelling Sentences)「建议收藏」一.概述DCNN(AConvolutionalNeuralNetworkforModellingSentences)byNalKalchbrenner等,又是文本分类论文的一力作。”准确表达句子的语义是语言理解的核心”,通过学习机器学习和TextCNN,我们可以知道n-gram特征是NLP文本任务和句子表达的一种重要方法。TextCNN通过不同步长的卷积核(例如2…

    2022年5月5日
    58

发表回复

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

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