我在C中有一个函数,它应该返回最负的两个补码:
int mostNegTwosComp(void) {
return 0;
}
我被限制使用最多4个位运算符。这些运算符包括:! ~ & ^ | + << >>
。我该怎么做呢?最负的两位的comp数不取决于所选的数是多少位吗?例如,10000将是16位int中最负的两位数吗?
发布于 2019-02-05 00:57:41
如果不需要可移植版本,则可以滥用整数几乎总是4个字节的知识。
return 0x80000000;
实际上,如果您知道要返回的类型的大小,您可以跳过按位进行的游戏,然后使用以下格式进行欺骗:
但要回答你剩下的问题。
我该怎么做呢?
如果你在做模板,你会(很可能)使用另一个答案所建议的按位计算的方法。否则,您可以使用上述代码进行欺骗,或者使用Lims.h (iirc)中的定义。
~ (~0u >> 1);
是个便携的解决方案。
最负的两位的comp数不取决于所选的数是多少位吗?
最负的两种恭维是取决于包含变量的大小,所以我想你可以说“选定的数字”。实际上,值的范围取决于包含变量的大小。
例如,10000将是16位int中最负的两位数吗?
对于16位,最负的两位是0x8000
、0b1000000000000000
或-32768
,这取决于您希望如何表示它。
发布于 2019-02-05 00:34:32
return ~ (~0u >> 1);
~
打开unsigned
零中的所有位。然后>> 1
向右移动,导致高比特变为零。然后~
反转所有比特,在高比特中产生一个,在其他位中产生零。
然后return
将其转换为int
。这有实现定义的行为,但这类类分配通常假定一种适合于练习的行为。
https://stackoverflow.com/questions/54526282
复制相似问题