判断一个数乘2后是否溢出

sasa27227 2020-04-17 04:17:15
32位操作系统下,给予1个整数 x ,如果它乘 2 之后会溢出则返回 0 否则返回 1 。
Legal ops: ~ & ^ | + << >>
Max ops: 20
...全文
1658 58 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_43370234 2020-05-01
  • 打赏
  • 举报
回复
牛批 学到了呀
qq_43370234 2020-05-01
  • 打赏
  • 举报
回复
学到了 谢谢楼主
hkwan 2020-04-22
  • 打赏
  • 举报
回复
very complicated, I cannot understand
sasa27227 2020-04-21
  • 打赏
  • 举报
回复
问题解决了,谢谢大家
zerozerg2006 2020-04-21
  • 打赏
  • 举报
回复
带符号的整数的话 n >= (1<<15) 就行了
我叫RT 2020-04-21
  • 打赏
  • 举报
回复
用一个更大范围的类型保存res,强转为 int 类型,如果相等就没有溢出,否则就是溢出。 return ( (int)res == res ? res : 0 )
舉杯邀明月 2020-04-20
  • 打赏
  • 举报
回复
引用 55 楼 早打大打打核战争 的回复:
[quote=引用 51 楼 舉杯邀明月 的回复:]
[quote=引用 46 楼 早打大打打核战争 的回复:]
好像无论如何算,都得经过“5次位运算”才行。
=============================

汇编可以只做一次移位

这跟是否用汇编没关系吧?
[/quote]

有关系,处理器实际上有溢出检查,只需要执行移位之后读一下溢出标志位就可以了
[/quote]
好吧,我把这个忽略了。
查了一下资料,确实是左移1位,然后检查OF的值,分别返回0或1就行了。
aburd 2020-04-20
  • 打赏
  • 举报
回复
看看,参考一下。。。。。。。。。
weixin_47212115 2020-04-20
  • 打赏
  • 举报
回复
第一次来,支持一下
  • 打赏
  • 举报
回复
nice,学习了,受益匪浅,ok
  • 打赏
  • 举报
回复
引用 51 楼 舉杯邀明月 的回复:
[quote=引用 46 楼 早打大打打核战争 的回复:]
好像无论如何算,都得经过“5次位运算”才行。
=============================

汇编可以只做一次移位

这跟是否用汇编没关系吧?
[/quote]

有关系,处理器实际上有溢出检查,只需要执行移位之后读一下溢出标志位就可以了
arfi 2020-04-20
  • 打赏
  • 举报
回复
刚说的不对,如果是负数,bit30要判断是否为0
arfi 2020-04-20
  • 打赏
  • 举报
回复
没这么麻烦吧,既然考虑正负,最高比特位(bit31)为符号位,看次比特位是否为1就行了。 return (x&(1<<30)) == 0;
  • 打赏
  • 举报
回复
好像无论如何算,都得经过“5次位运算”才行。
=============================

汇编可以只做一次移位
sasa27227 2020-04-19
  • 打赏
  • 举报
回复
不好意思各位,讨论的是int类型的整数。至于溢出题目没有明确表示是如何溢出的,可能没有说清楚,不好意思。另外题目给了两个例子,分别是: 例如: f(0x20000000) = 1 例如: f(0x40000000) = 0
zgl7903 2020-04-19
  • 打赏
  • 举报
回复
*2 的结果 再除以2, 如果和原数一样就没有溢出
双杯献酒 2020-04-19
  • 打赏
  • 举报
回复
#include <limits.h>
bool isOver(int x)
{
return (x > (INT_MAX >> 1)) || (x < (INT_MIN >> 1));
}
舉杯邀明月 2020-04-19
  • 打赏
  • 举报
回复
好像无论如何算,都得经过“5次位运算”才行。


算法1: (n>>31)^((n<<1)>>31)^1
算法2: ~((N) << 1 ^ (N)) >> 31 & 1
算法3: ((n>>31)^(n>>30)^1)&1
舉杯邀明月 2020-04-19
  • 打赏
  • 举报
回复
int f(int n) {
return ((n>>31)^(n>>30)^1)&1;
}
  • 打赏
  • 举报
回复
#27的代码就是可以的,如果你要完全符合要求(Legal ops: ~ & ^ | + << >> Max ops: 20):
#define M2O(N) (~((N) << 1 ^ (N)) >> 31 & 1)
加载更多回复(38)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧