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

用位运算符返回C中最负的两个补码数,c,binary,bit-manipulation,twos-complement,C,Binary,Bit Manipulation,Twos Complement,我在C中有一个函数,它应该返回最负的两个补码: int mostNegTwosComp(void) { return 0; } 我最多只能使用4个位运算符。这些运算符包括:!~&^ |+>。我该怎么做呢?最负二的comp数不是取决于所选数字的位数吗?例如,10000将是16位整数中最负的2的comp数 return ~ (~0u >> 1); ~打开无符号零中的所有位。然后>>1右移,导致高位变为零。然后~反转所有位,在高位生成一个,在其余位生成零 然后返回将其转换为i

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

int mostNegTwosComp(void) {

    return 0;
}
我最多只能使用4个位运算符。这些运算符包括:!~&^ |+>。我该怎么做呢?最负二的comp数不是取决于所选数字的位数吗?例如,10000将是16位整数中最负的2的comp数

return ~ (~0u >> 1);
~打开无符号零中的所有位。然后>>1右移,导致高位变为零。然后~反转所有位,在高位生成一个,在其余位生成零

然后返回将其转换为int。这有实现定义的行为,但这类类赋值通常假定行为适合于此练习

~打开无符号零中的所有位。然后>>1右移,导致高位变为零。然后~反转所有位,在高位生成一个,在其余位生成零


然后返回将其转换为int。这有实现定义的行为,但此类类赋值通常假定行为适合于此练习。

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

return 0x80000000;
事实上,如果您知道要返回的类型的大小,您可以跳过逐位游戏并使用以下格式进行作弊:

在0x\uuux中,每个数字是4位。这意味着2位是一个字节。 您希望第一位为1,所有其他位为0。 0x8=0b1000 因此,对于超过第一个字节的类型的每个字节,可以将值表示为0x80+2'0。 但是要回答你剩下的问题

我该怎么做呢

如果您正在模板化,您可能会使用另一个答案建议的按位技巧。否则,您可以使用上述代码进行欺骗,或者使用limits.h iirc中的定义

~ (~0u >> 1);
这将是一个可移植的解决方案

最负二的comp数不是取决于所选数字的位数吗

最负面的两个赞美取决于包含变量的大小,所以我想你可以说是selected number。事实上,值的范围取决于包含变量的大小

例如,10000将是16位整数中最负的2的comp数

return ~ (~0u >> 1);

对于16位,最负的两个comp将是0x8000、0b1000000000000000或-32768,这取决于您希望它的表示方式。

如果您不需要便携式版本,您可以滥用整数几乎总是4字节的知识

return 0x80000000;
事实上,如果您知道要返回的类型的大小,您可以跳过逐位游戏并使用以下格式进行作弊:

在0x\uuux中,每个数字是4位。这意味着2位是一个字节。 您希望第一位为1,所有其他位为0。 0x8=0b1000 因此,对于超过第一个字节的类型的每个字节,可以将值表示为0x80+2'0。 但是要回答你剩下的问题

我该怎么做呢

如果您正在模板化,您可能会使用另一个答案建议的按位技巧。否则,您可以使用上述代码进行欺骗,或者使用limits.h iirc中的定义

~ (~0u >> 1);
这将是一个可移植的解决方案

最负二的comp数不是取决于所选数字的位数吗

最负面的两个赞美取决于包含变量的大小,所以我想你可以说是selected number。事实上,值的范围取决于包含变量的大小

例如,10000将是16位整数中最负的2的comp数

return ~ (~0u >> 1);

对于16位,最负的两个comp将是0x8000、0b1000000000000000或-32768,具体取决于您希望它的表示方式。

!和+不是按位运算符。我们是不是要把你的意思简单地理解为,你给出的列表包含了所有允许你使用的操作符?@EricPostPhischil说实话,我并不完全清楚这个问题的意思,但我确实没有很好地说明我的困惑。我还是不能,而且似乎有足够多的人同意一个意思,因此删除了注释。@aschepler:这些问题要求使用最多四个列出的运算符生成最负的int值,该值是所有int值中的最小值。您正在查找带符号的~~0U>>1,但请注意,这意味着您的内部表示是二的补码。否则,你会被判U.B。!和+不是按位运算符。我们是不是要把你的意思简单地理解为,你给出的列表包含了所有允许你使用的操作符?@EricPostPhischil说实话,我并不完全清楚这个问题的意思,但我确实没有很好地说明我的困惑。我仍然不能,而且似乎有足够多的人在某个意义上达成了一致,所以删除了该评论。@aschepler:这些问题要求生成
is most negative具有所有int值的最小值,最多使用列出的四个运算符。您正在查找带符号的~~0U>>1,但请注意,这意味着您的内部表示是2的补码。否则,你会得到U.B。尽管在实践中很可能有效,~~0u>>1不是一个可移植的解决方案,因为另一个答案已经给出了,而且它和你的另一个假设了两个的补码表示。但是它比你的主要建议更具可移植性,因为它不依赖于任何关于int类型宽度的假设。那么,是否有任何相对常见的配置不会导致~~0u>>1对于最合理的意图和目的来说不够可移植?我知道为什么它不能完全便携,但不知道它在哪里不够便携。正如我所说,很可能在实践中起作用。但在我的书中,便携式并不是一个相对的形容词。我几乎把它等同于严格遵守标准。要么是代码,要么不是,~~0u>>1不是。你说得对,@Daniel,我用了草率、不一致的措词试图总结观察结果,即~~0u>>1所依赖的假设较少。@Daniel Brilliant!谢谢你,我的朋友,你的清晰解释非常有用。虽然很可能在实践中起作用,~0u>>1不是一个可移植的解决方案,因为另一个答案已经给出了,而且它和你的另一个假设了两个的补码表示。但是它比你的主要建议更具可移植性,因为它不依赖于任何关于int类型宽度的假设。那么,是否有任何相对常见的配置不会导致~~0u>>1对于最合理的意图和目的来说不够可移植?我知道为什么它不能完全便携,但不知道它在哪里不够便携。正如我所说,很可能在实践中起作用。但在我的书中,便携式并不是一个相对的形容词。我几乎把它等同于严格遵守标准。要么是代码,要么不是,~~0u>>1不是。你说得对,@Daniel,我用了草率、不一致的措词试图总结观察结果,即~~0u>>1所依赖的假设较少。@Daniel Brilliant!谢谢你,伙计,你清楚的解释很有帮助。