躲在树丛玩泥巴 2021-02-17 09:40 采纳率: 71.4%
浏览 266
已采纳

有关c语言不同位数进行位运算的问题

如果要将一个特定的整型数a的bit15清0,其他位不变

a&=~(1<<15);
a&=0x3f<<3;
a>>=3;

如果要求a的bit3~bit8的对应整数

 

问题是:在第一个&运算中,a从bit16开始的后面高位应该是被保留了  

而在第二个运算中为什么a从bit8开始的高位不被保留?

提问可能没提清楚,简单点讲就是  我想知道不同长度进行位运算是如何进行的  为什么上面两种情况截然不同

  • 写回答

4条回答 默认 最新

  • 中华神威 2021-02-17 14:30
    关注

    你的意思的想知道二进制数怎么个左右移法是吧,安排,给你整的明明白白的。

    就按你给的这两行代码:

    a&=~(1<<15)等价于:

    a=a&~(1<<15)

    这行代码优先级最高的是括号里的,我们知道整型变量一般是占4个字节,一个字节有八位,所以4x8=32位。

    首先<<是左移符哈,箭头朝那边就往那边移。

    那么1<<15是怎么个移法,请看:

    1是整型数,占四个字节,在计算机内是以二进制数存储,且是以补码的形式存储,而1是正数,正数的原码=补码=反码

    所以1的补码是:00000000 00000000 00000000 00000001

    总共32位,那么1<<15就是从1的二进制补码左边第一个开始数,数15个,移多少位就数多少位,这15个数全部拿走,再在1的二进制补码的末尾补15个0就是1<<15了。左移完就是:

    0 00000000 00000001 00000000 0000000

    之后~(1<<15)的 ~ 表示按位取反,就是每一位都取反,取反后的二进制数:1 11111111 11111110 11111111 1111111

    然后a&~(1<<15)的 & 表示取反后的这个二进制数与你给定的整型数a按位与,与的话学过数电都知道,只有1和1与才是1,0和1,0和0与都是0.这就是左移的具体移法。最后给你总结一下:对于左移,不管是正数还是负数左移统统在末尾补0,移多少补多少个0.对于右移,区分正负数,正数的话在高位补0,移多少补多少,但是负数,先要求出负数在计算机中的补码,之后在右移,但这时候不是在最高位补0了,而是补1了,也是移多少补多少,举个例子-10>>3,-10右移3位,

    -10的原码:10000000 00000000 00000000 00001010

    -10的反码:11111111 11111111 11111111 11110101

    -10的补码:11111111 11111111 11111111 11110110

    右移三位,最右边三个拿走,在高位补1:

    -10>>3   :111 11111111 11111111 11111111 11110

    因为这是补码,补码的补码等于实际的原码,所以

                100 00000000 00000000 00000000 00001

                100 00000000 00000000 00000000 00010

    所以-10>>3后的数字其实是-2,你可以打印试试,左右移就是这么移的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog