【问题标题】:C: get the bits of an integerC:获取整数的位
【发布时间】:2019-03-08 16:00:32
【问题描述】:

我有一个程序,它将两个 4 字节整数作为输入,我需要像这样将它们存储到整数数组中......

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

int main (int argc, char *argv[]) {
    int vals1[32], vals2[32];
    int num1 = atoi(argv[1]);
    int num2 = atoi(argv[2]);

    // so argv[1] might be 47 and I would want to set the values of the vals1 array to reflect that in binary form
}

有什么建议吗?

【问题讨论】:

  • 提示:对于正数,'%2' 提取最低有效二进制数字,/ 2 删除最后一个二进制数字。
  • 您的问题不清楚。那么您的输入是字符串吗?您是否只想将其作为 int 存储到 int 数组中?你想要你的 int 的二进制表示吗?代表什么?
  • 到目前为止你尝试过什么?你具体卡在哪里了?
  • @Superlokkus,我正在使用一个 cstring,我将使用 atoi 函数将其转换为整数。因此,我从“47”开始并将其转换为整数 47,但随后想要提取表示 47 为整数的二进制位并将它们存储在 val1
  • int nthbit(unsigned long long x, int n) { return (x &gt;&gt; n) &amp; 1; }

标签: c binary integer


【解决方案1】:

第一个任务是将char * 转换为int,您说可以。所以接下来是下一部分,即获取二进制表示。为了获得任何数据类型的二进制表示,Shift Operator 的使用是最好的方法之一。您可以通过对数据类型执行移位然后执行 Bitwise AND 来获得它,即&amp;1。例如,如果n 是一个整数

int n = 47;
for (int i = 0; i < 32; i++)
{
   /* It's going to print the values of bits starting from least significant. */
   printf("Bit%d = %d\r\n", i, (unsigned int)((n >> i) & 1));
}

因此,使用移位运算符,您的问题的解决方案类似于

void fun(int n1, int n2)
{
    int i, argv1[32], argv2[32];

    for (i = 0; i < 32; i++)
    {
        argv1[i] = ((unsigned int)n1 >> i) & 1;
        argv2[i] = ((unsigned int)n2 >> i) & 1;
    }
}

您必须注意位顺序,即哪个位存储在数组索引的哪个位置。

【讨论】:

  • n1 &gt;&gt; i 如果n1 为负数,则具有实现定义的行为。你应该使用(unsigned int)n1 &gt;&gt; i
  • 例如,如果 n1 为负数会发生什么,请详细说明。非常感谢。
  • @Mazhar This 解释它。
  • 另一点:您做出sizeof(int) == 4 的静默假设,因为您使用for (i = 0; i &lt; (8 * sizeof(int)); i++) 并且大小的固定大小为32。最好写for (i = 0; i &lt; 32; i++)
  • 我冒昧地修正了答案代码中的括号:n1 必须在 &gt;&gt; 操作之前强制转换。
猜你喜欢
  • 2015-05-30
  • 2011-06-01
  • 1970-01-01
  • 2011-06-24
  • 2015-11-28
  • 2015-04-18
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多