鱼C论坛

 找回密码
 立即注册
查看: 1368|回复: 5

[已解决]二进制的数移位问题

[复制链接]
发表于 2022-6-18 23:27:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.

#include<stdio.h>

void main()
{
        int a = 20, b;
        for (int i = 1; i <= 3; i++)
        {
                b = a >> i;
                printf("%d>>%d位后为:%d\n", a, i, b);
        }
}
**********************************************************************************
20>>1位后为:10
20>>2位后为:5
20>>3位后为:2

C:\Users\lenovo\Desktop\Project1\x64\Debug\Project1.exe (进程 27476)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
************************************************************************************
这个是正常的,有正常的进度损失


2.
#include<stdio.h>

void main()
{
        int a = 20, b;
        for (int i = 1; i <= 3; i++)
        {
                b = a >> i;
                printf("%d>>%d位后为:%d\n", a, i, b);
        }
}
********************************************************************************
-20>>1位后为:-10
-20>>2位后为:-5
-20>>3位后为:-3

C:\Users\lenovo\Desktop\Project1\x64\Debug\Project1.exe (进程 30252)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
*********************************************************************************
这个就是多了个负号  -20右移3为就不是-2了额
按理来说:原码 :          1001 0100.
                右移3为后:   1000 0010.100(舍弃)  即:1000 0010    =-2;
最佳答案
2022-6-18 23:42:07
她与晚风 发表于 2022-6-18 23:37
额,为啥-5/2  这个原理不是进行移位操作吗,变相的“/2”,我刚学计算机组成原理,按上面内种讲法,就是会 ...

20 0001 0100 进行求补运算 取反1110 1011 +1后 1110 1100 这就是-20的二进制
-20>>3 算术右移3位 1111 1101 变成这个 也就是-3 对应的二进制了
因为是负数,左边第一位是1,所以算术右移3位相当于左边加 3个 1,右边再减去3位 .
至于取最小值那是我记忆的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-18 23:33:49 | 显示全部楼层
-5 /2 = -2.5 取最小的,因为-3<-2,所以取-3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-18 23:37:34 | 显示全部楼层
临时号 发表于 2022-6-18 23:33
-5 /2 = -2.5 取最小的,因为-3

额,为啥-5/2  这个原理不是进行移位操作吗,变相的“/2”,我刚学计算机组成原理,按上面内种讲法,就是会造成精度损失,您说的我没听懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-18 23:38:38 | 显示全部楼层
临时号 发表于 2022-6-18 23:33
-5 /2 = -2.5 取最小的,因为-3

右移3为后:   1000 0010.100(舍弃)  即:1000 0010    =-2;
我这一步有啥毛病吗呜呜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-18 23:42:07 | 显示全部楼层    本楼为最佳答案   
她与晚风 发表于 2022-6-18 23:37
额,为啥-5/2  这个原理不是进行移位操作吗,变相的“/2”,我刚学计算机组成原理,按上面内种讲法,就是会 ...

20 0001 0100 进行求补运算 取反1110 1011 +1后 1110 1100 这就是-20的二进制
-20>>3 算术右移3位 1111 1101 变成这个 也就是-3 对应的二进制了
因为是负数,左边第一位是1,所以算术右移3位相当于左边加 3个 1,右边再减去3位 .
至于取最小值那是我记忆的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-18 23:50:59 | 显示全部楼层
临时号 发表于 2022-6-18 23:42
20 0001 0100 进行求补运算 取反1110 1011 +1后 1110 1100 这就是-20的二进制
-20>>3 算术右移3位 1111  ...

啊这个  1110 1100是-20的补码吧,您这个是用补码移位然后在转化过来吗还是怎么的,我没学到这里了

我这个原码直接移动有啥毛病呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-9 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表