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


相关推荐

  • webstorm的永久激活码2021-激活码分享[通俗易懂]

    (webstorm的永久激活码2021)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    3.0K
  • 计算机基础

    计算机基础

    2021年5月20日
    126
  • 数据结构之哈希表(HASH)

    前言   当我们在编程过程中,往往需要对线性表进行查找操作。在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i;在有序表中查找时,我们经常使用的是二分查找,通过比较key与a[i]的大小来折半查找,直到相等时才返回索引i。最终通过索引找到我们要找的元素。   但是,这两种方法的效率都依赖于查找中比较的次数。我们有一种想法,能不能不经过比较,而是

    2022年4月1日
    82
  • 用bc做国密sm2加解密、SM3withSM2签名验签等

    用bc做国密sm2加解密、SM3withSM2签名验签等importorg.bouncycastle.asn1.ASN1EncodableVector;importorg.bouncycastle.asn1.ASN1Integer;importorg.bouncycastle.asn1.ASN1Sequence;importorg.bouncycastle.asn1.DERSequence;importorg.bouncycast…

    2025年12月10日
    3
  • python截取指定字符串_python字符串截取,python字符串切片的方法详解

    python截取指定字符串_python字符串截取,python字符串切片的方法详解字符串本质上就是由多个字符组成的 Python 允许通过索引来操作字符 比如获取指定索引处的字符 获取指定字符在字符串中的位置等 Python 字符串直接在方括号 中使用索引即可获取对应的字符 其基本语法格式为 string index 这里的 string 表示要截取的字符串 index 表示索引值 例 1 s crazyit orgisverygoo 获取 s 中索引 2 处的

    2025年11月9日
    3
  • 系统蓝屏代码

    系统蓝屏代码

    2021年9月10日
    51

发表回复

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

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