讨论/技术交流/csapp data-lab/

题目描述:howManyBits - return the minimum number of bits required to represent x in two's complement.
Legal ops: ! ~ & ^ | + << >>
Max ops: 90

问题:下面是我的解法,但是使用dlc时出现bit16, bit8, bit4, bit2未定义问题。使用btest测试结果未发现错误。想问问老哥们遇到过这个问题吗?

/* howManyBits - return the minimum number of bits required to represent x in
 *             two's complement
 *  Examples: howManyBits(12) = 5
 *            howManyBits(298) = 10
 *            howManyBits(-5) = 4
 *            howManyBits(0)  = 1
 *            howManyBits(-1) = 1
 *            howManyBits(0x80000000) = 32
 *  Legal ops: ! ~ & ^ | + << >>
 *  Max ops: 90
 *  Rating: 4
 */
//~优先级比+高
//这个测试没问题,但是使用dlc时输出bit16, bit8, bit4未定义???
//难度不能定义中间变量??
int howManyBits(int x) {
  //x为正数则不变,否则变为(~x+1)+1
  //如果x为负数那么mask为0xFFFF FFFF否则为0
  //下面的三条语句目的:如果x为负数那么将其变为-(x + 1),
  //原因是对于补码来说负数总是比正数多一个,也就是说:如果可以表x那么一定可以表示-x - 1(其中x>=0)
  //如果为非负数则不变
  int mask = (x >> 31 & 1) << 31 >> 31;
  int tx = (~mask & x) | (mask & (~(x + 1)) + 1);
  int cnt = 0;

  //下面的方法就是二分
  //如果前16位非0,那么bit16为0xFFFF FFFF 否则为0
  //如果前16位非0,那么tx要向有移动16位
  int bit16 = !!(tx >> 16) << 31 >> 31;
  cnt = cnt + (bit16 & 16);
  tx = tx >> (bit16 & 16);

  int bit8 = !!(tx >> 8) << 31 >> 31;
  cnt = cnt + (bit8 & 8);
  tx = tx >> (bit8 & 8);

  int bit4 = !!(tx >> 4) << 31 >> 31;
  cnt = cnt + (bit4 & 4);
  tx = tx >> (bit4 & 4);

  int bit2 = !!(tx >> 2) << 31 >> 31;
  cnt = cnt + (bit2 & 2);
  tx = tx >> (bit2 & 2);

  int bit1 = !!(tx >> 1) << 31 >> 31;
  cnt = cnt + (bit1 & 1);
  tx = tx >> (bit1 & 1);

  cnt = cnt + (tx & 1);

  //留出一个符号位
  return cnt + 1;    
}
共 2 个回复

谢谢老哥

这个问题在这个论坛里可能能回答的人不多,你可以试试在网上找一下这本书的读书小组,试试在那里提问。