【问题标题】:To print intermediate value of left or right shift in C在 C 中打印左移或右移的中间值
【发布时间】:2015-02-18 05:49:56
【问题描述】:

在“十进制数”的左移或右移期间,我想要二进制格式而不是十进制的结果。我知道如何将十进制转换为二进制。还有其他方法可以捕获中间二进制值吗?

【问题讨论】:

  • 不知道你到底要什么,你能提供一个你想要的例子吗?
  • 中间二进制值是什么意思 ???
  • 别忘了,大多数计算机只能以二进制运行。十进制输出要求您将二进制表示转换为十进制。也就是说,没有打印二进制文件的标准方法。通过捕获“中间结果”,您的意思是如果您执行uint16_t x = 0x9876; x >>= 5;,那么您希望看到x >> 1x >> 2x >> 3x >> 4 的结果以及最终的x >>= 5;?如果是这样,您将不得不在循环中生成并打印这些中间值。
  • 你不是在移动一个十进制数,你是在移动一个一个数字。数字是一个数字,事实上它在内部以二进制表示(可能。谁知道现代 CPU 寄存器是如何制造的?也许它们以 4 为基数工作)仅影响某些操作的速度。数字基数只是外部表示的东西。你想要base 10吗?执行除/模除以 10 循环来计算每个数字,这就是 printf 在内部所做的。你想要base 2吗?是一样的,但是有 2 个(这意味着它可以用 shift 和 mask 进行优化)。

标签: c binary printf decimal bit-shift


【解决方案1】:

这里是十六进制打印的方法,您可以很容易地在脑海中将其转换为二进制。

printf("0x%x\n", my_int);

下面是以二进制格式打印数字的代码:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv)
{
  char buf[65] = { 0 }, *endptr;
  long my_int;
  unsigned long tmp_int;
  int i, j;

  if (argc != 2 || (errno = 0, (my_int = strtol(argv[1], &endptr, 0)), errno) || *endptr)
    exit((fprintf(stderr, "Usage: %s <number>\n", argv[0]), 1));

  /* break my_int down into a binary character represenation */

  tmp_int = my_int;
  i = 0;

  do
  {
    buf[i++] = ((tmp_int & 0x1) ? '1' : '0');
    tmp_int >>= 1;
  }
  while (0 != tmp_int);

  /* reverse buf for printing */

  for (j = 0, --i; j < i; ++j, --i)
  {
    char c = buf[j];

    buf[j] = buf[i];
    buf[i] = c;
  }

  printf("%s\n", buf);

  return 0;
}

【讨论】:

  • 注意:这不是“将十进制转换为二进制”,它只是以二进制打印数字,因为该数字从不是十进制开始的。
  • @jschultz410 感谢您的回答。问题是我知道如何将十进制转换为二进制,我想知道的是如何在我对十进制数进行左/右移位转换时捕获/截取二进制值(因为系统实际上是在二进制中进行转换格式然后提供十进制值)
  • 十进制移位是指将数字乘以或除以十的幂吗?我不知道有什么方法可以在 CPU 对其进行操作时捕获或截取中间值,甚至不知道这意味着什么。您可以在代码中将计算绘制成几个离散的步骤,并根据需要以二进制形式打印每个步骤的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多