【问题标题】:Converting from Binary to Decimal without using arithmetic operations [closed]在不使用算术运算的情况下从二进制转换为十进制 [关闭]
【发布时间】:2016-06-07 20:52:51
【问题描述】:

在我意识到 * 是算术运算之前,我一直在写这个。

我想返回二进制序列输入的非负整数表示。 IE。 0x4a 以十进制返回 74

typedef unsigned bit16;

unsigned int bin_to_dec(bit16 x)
{
int dec=0;
int k=0;
int remainder;

while (x!= 0){
    remainder = x%10;
    dec+=remainder*k;
    k=k+2;
    x=x/10;
}

:(

如果我不能使用除 +/- 以外的算术运算,我将如何进行这种转换?

【问题讨论】:

  • 您错过了也是算术运算的 %、+ 和 /。但为什么呢?
  • 如果你的函数是返回一个int,那么在什么意义上你期望这个值是十进制而不是二进制?
  • @Code_Penguin,int 不比任何其他算术类型多十进制,显然包括bit16。 C 根据位集合定义整数类型的表示。
  • 请去掉IEEE标签。
  • @Code_Penguin 0x4A 74。它们在 C 中表示完全相同的文字。尝试 printf 你的 bit16 你会看到。

标签: c binary ieee-754 16-bit


【解决方案1】:

由于+也是算术运算,所以变得困难。根据具体规则,使用查找表可能是可以接受的:return lookuptable[x];

【讨论】:

  • 你可以使用一个非常大的 switch 语句 :-)
  • 如果输入被认为是非十进制的,那么返回的 int 是什么意思?
  • 我认为这并不难...如果 OP 可以使用二元运算符为 + 和 - 写下函数并以我使用这些函数进行加减的方式休息...我觉得不难
【解决方案2】:

允许使用 + 和 -...而不是乘以 k*reamainder 尝试以这种方式循环

int n;//consider new int

在while循环中写第一行

n=remainder;

而不是*

for(i=0;i<k;i++)
    remainder+=n;

这会做乘法:)。

对于x%10,构造一个函数

int mod(int n)
{
   int m;
   while(n>0)
   {
      n=n-10;
      m=n;
    }
   return m;
}

对于 x/10,它是相同的,但您必须返回减去的次数,如下所示:

int mod(int n)
{
   int count=0;
   while(n>0)
   {
      count=count+1;
      n=n-10;
   }
   return count;
}

编辑:如果 + 和 - 也不允许尝试使用二元运算符为它们创建函数,并在上面的答案中使用它们而不是 + 和 - !

【讨论】:

  • 暂时忽略问题的错误前提,如果要避免算术运算,您为什么认为+=+ 部分是允许的?
  • +/- 是允许的,它们是问题中唯一的例外
  • 在最后一行没有提到他可以使用 + / 和 - @JohnBollinger 看到最后一行
  • @CherubimAnand,很公平——OP对“算术运算”有一个奇怪的定义。尽管如此,尽管您提供了一种解决他所询问的不允许乘法的方法,但他似乎仍然忽略了 /%
  • 是的,我已经完成了 % @JohnBollinger
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多