Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在2s补码中查找存储int的最少位_C_Bit Manipulation - Fatal编程技术网

C 在2s补码中查找存储int的最少位

C 在2s补码中查找存储int的最少位,c,bit-manipulation,C,Bit Manipulation,这是我目前正在研究的家庭作业问题。我们要做的是查看传递的32位int x,并返回将该值存储在2s补码中所需的最少位 例如: howManyBits(0) = 1; howManyBits(-1) = 1; howManyBits(7) = 4; howManyBits(-10) = 5; 问题在于,我只能使用位运算符来查找,不能有大于一个字节的常量,也不能有超过90个操作。 现在,我可以从最重要的一位开始,一路往右抹去一个1,然后我计算其中的每一个1。然而,由于它是一个32位的int,每次我检

这是我目前正在研究的家庭作业问题。我们要做的是查看传递的32位int x,并返回将该值存储在2s补码中所需的最少位

例如:

howManyBits(0) = 1;
howManyBits(-1) = 1;
howManyBits(7) = 4;
howManyBits(-10) = 5;
问题在于,我只能使用位运算符来查找,不能有大于一个字节的常量,也不能有超过90个操作。 现在,我可以从最重要的一位开始,一路往右抹去一个1,然后我计算其中的每一个1。然而,由于它是一个32位的int,每次我检查一个位是否被翻转时,我都必须将int移到1的右边,因此计算位的过程本身需要90次运算,而由于位涂抹需要20次,我远远超过了最大运算量

此外,我也不想在我的解决方案中使用条件或循环

我知道如果我能想出一个log_2算法来解决这个问题,但我也不能仅仅用位运算符来解决这个问题


我想要的只是一个流程的提示/解释,它可以用更少的操作完成,而不是一个实际的代码解决方案。谢谢

休斯顿-你有个问题

i、 e


因此,零至少需要2位。(或-1)

由于这是家庭作业,我不想给你一个直接的答案,但你的log2想法是正确的

您可以通过三个操作的组合来实现(对于正数)

 1) Shift right 1
 2) Test for 0
 3) Add 1 to a number

希望这足以让你达到目的。由于源代码是2的补码,您需要首先将其转换为正数,以便上述操作生效。

您可以在7次操作中找到32位数字的log_2。请看精彩的

我认为分享您的代码将带来更多的关注和有用的答案。这并不是一个实际的编程问题。这只是一个谜题,对网站的未来访问者来说不太可能有用。通常,-1在2的补码中是
0xffffff
。这意味着您需要32位来存储它。“还是我在这里遗漏了什么?”雷蒙森我必须恭敬地表示不同意。这是许多数据压缩算法中常用的一种技术。@MultimediaMike压缩单个整数没有什么意义。找到编码一组整数的最小位数很有趣。然而,上面提到的问题的约束是相当人为的。这基本上是我目前正在做的,但是需要90个操作才能完成。嗯。在这种情况下,我不完全清楚什么构成“操作”,但如果代码大小不是问题,而是为任何特定值执行的指令数,则可以二进制搜索最高的集合位。i、 e.第16档测试,测试0档,如果是,则测试8档,然后重试,否则测试24档,以此类推。。。取决于你如何计算每次测试2-3次操作,最多5轮,15次操作。否。想想在2s补码中0是如何编码的。80年代。和-1由八个1组成。因此,只有0等于0,只有1等于-1。所以0和-1都只需要1位就可以准确地表示。@fuzzxl-想一想。你至少需要一点来说明剩下的是一个值。还需要一个位来区分X和Y。即1和0。@Beregond-使用位的最大值00=0、01=1、10=-2、11=-1或一个位0或1。即使在十进制表示法中,由于空和为零,空字也计算为零。如果没有有效值,则结果为零。@fuzzxl-您没有得到它。信息需要一个值。所以零的值需要一些数据。回到你的理论,你如何区分零和一的值?我想你需要一点。
 1) Shift right 1
 2) Test for 0
 3) Add 1 to a number