首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用位运算符返回C中最负的两个补数

用位运算符返回C中最负的两个补数
EN

Stack Overflow用户
提问于 2019-02-05 00:29:35
回答 2查看 691关注 0票数 1

我在C中有一个函数,它应该返回最负的两个补码:

代码语言:javascript
运行
复制
int mostNegTwosComp(void) {

    return 0;
}

我被限制使用最多4个位运算符。这些运算符包括:! ~ & ^ | + << >>。我该怎么做呢?最负的两位的comp数不取决于所选的数是多少位吗?例如,10000将是16位int中最负的两位数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-05 00:57:41

如果不需要可移植版本,则可以滥用整数几乎总是4个字节的知识。

代码语言:javascript
运行
复制
return 0x80000000;

实际上,如果您知道要返回的类型的大小,您可以跳过按位进行的游戏,然后使用以下格式进行欺骗:

  1. 在0x__中,每个数字是4 bits.This,意思是两个数字是一个字节。
  2. 您希望第一个位是1,所有其他位都是0。
  3. 0x8 = 0b1000
  4. 因此,对于超过第一个类型的每个字节,都可以将值表示为0x80 +2 '0's。

但要回答你剩下的问题。

我该怎么做呢?

如果你在做模板,你会(很可能)使用另一个答案所建议的按位计算的方法。否则,您可以使用上述代码进行欺骗,或者使用Lims.h (iirc)中的定义。

代码语言:javascript
运行
复制
~ (~0u >> 1);

是个便携的解决方案。

最负的两位的comp数不取决于所选的数是多少位吗?

最负的两种恭维是取决于包含变量的大小,所以我想你可以说“选定的数字”。实际上,值的范围取决于包含变量的大小。

例如,10000将是16位int中最负的两位数吗?

对于16位,最负的两位是0x80000b1000000000000000-32768,这取决于您希望如何表示它。

票数 2
EN

Stack Overflow用户

发布于 2019-02-05 00:34:32

代码语言:javascript
运行
复制
return ~ (~0u >> 1);

~打开unsigned零中的所有位。然后>> 1向右移动,导致高比特变为零。然后~反转所有比特,在高比特中产生一个,在其他位中产生零。

然后return将其转换为int。这有实现定义的行为,但这类类分配通常假定一种适合于练习的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54526282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档