返回最消极的二进制补码数与位运算符Ç

问题描述 投票:1回答:2

我有在C函数应该返回最负二补数:

int mostNegTwosComp(void) {

    return 0;
}

我不得不使用最多4个运算符。这些运营商包括:! ~ & ^ | + << >>。我将如何去这样做呢?那岂不是最负二层的补偿数量取决于有多少位选择的是多少?例如,10000将是一个16位的整型最负二层的补偿是多少?

c binary bit-manipulation twos-complement
2个回答
2
投票

如果你并不需要一个便携版本,你可以滥用知识整数几乎都是4个字节。

return 0x80000000;

事实上,如果你知道你要返回类型的大小,你可以跳过按位游戏,并与格式的金手指:

  1. 在0x__,每个数为4个bits.This装置2位为一个字节。
  2. 你想第一位是1,而其他位为0。
  3. 0x8中= 0b1000
  4. 因此,你可以代表值为0x80的+ 2“0'的类型过去第一的每个字节。

但是,为了回答你的问题的其余部分。

我将如何去这样做呢?

如果你模板化,你会(可能)使用按位招对方的回答暗示。否则,你可以用上面的代码欺骗或limits.h中(IIRC)使用的定义。

~ (~0u >> 1);

将是一个便携式解决方案。

那岂不是最负二层的补偿数量取决于有多少位选择的是多少?

最负二层的赞美是取决于包含变量的大小,所以我想“选择号码”你可以说。实际上,该值的范围依赖于含有可变量的大小。

例如,10000将是一个16位的整型最负二层的补偿是多少?

对于16位,最负二层的补偿将是0x80000b1000000000000000-32768,这取决于您希望如何处理它代表。


2
投票
return ~ (~0u >> 1);

~开启在unsigned零所有位。然后>> 1向右移动,导致高比特变为零。然后~反转所有位,产生在其余1个在高比特和零。

然后return转换这int。这有实现定义的行为,但是这种类型的课堂作业通常假定适合的锻炼行为。

© www.soinside.com 2019 - 2024. All rights reserved.