我想将二进制文件的每个字符放入数组中它自己的空间中。但是,我似乎无法从字符串数组中的返回值中保存数字。
如果我理解您的要求,有多种方法可以解决此问题。首先,不需要将数字的二进制表示的结果实际存储在要调用的数组中T1()
或T0()
基于构成数字的任何给定位的位值。
以您的示例24
(二进制11000
)为例。如果我正确阅读了您的帖子,您会说:
在这种情况下,由于十进制是24
,因此二进制应该是11000
执行函数T1()
2
times 和T0()
6
times 。
(我不确定您在哪里获得6
时间,看起来您打算T0()
将其称为3
时间)
例如,如果您已经定义T0
并T1
简单地让您知道它们何时被调用,例如:
void T1 (void) { puts ("T1 called"); }
void T0 (void) { puts ("T0 called"); }
您可以编写一个函数(例如命名callt
)来调用T1
每个数字1-bit
中T0
的每个0-bit
,如下所示:
void callt (const unsigned long v)
{
if (!v) { putchar ('0'); return; };
size_t sz = sizeof v * CHAR_BIT;
unsigned long rem = 0;
while (sz--)
if ((rem = v >> sz)) {
if (rem & 1)
T1();
else
T0();
}
}
到目前为止,如果您传递24
给 function callt (24)
,输出将是:
$ ./bin/dec2bincallt
T1 called
T1 called
T0 called
T0 called
T0 called
(答案末尾提供了完整示例)
另一方面,如果您确实想将二进制文件的每个字符放入数组中自己的空间中,那么您只需要传递一个数组来捕获位值(and 的 ASCII 字符表示'0'
,'1'
或者只是0
and 1
) 而不是调用T0
and T1
(如果您将数组用作字符串,您还可以添加几行来处理v=0
以及nul 终止字符)例如:
/** copy 'sz' bits of the binary representation of 'v' to 's'.
* returns pointer to 's', on success, empty string otherwise.
* 's' must be adequately sized to hold 'sz + 1' bytes.
*/
char *bincpy (char *s, unsigned long v, unsigned sz)
{
if (!s || !sz) {
*s = 0;
return s;
}
if (!v) {
*s = '0';
*(s + 1) = 0;
return s;
}
unsigned i;
for (i = 0; i < sz; i++)
s[i] = (v >> (sz - 1 - i)) & 1 ? '1' : '0';
s[sz] = 0;
return s;
}
如果您有任何其他问题,请告诉我。下面是两个示例程序。两者都将要转换(或处理)为二进制的数字作为其第一个参数(默认值:如果没有给出参数,则为 24)。第一个简单地调用T1
each1-bit
和T0
for each 0-bit
:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> /* for CHAR_BIT */
void callt (const unsigned long v);
void T1 (void) { puts ("T1 called"); }
void T0 (void) { puts ("T0 called"); }
int main (int argc, char **argv) {
unsigned long v = argc > 1 ? strtoul (argv[1], NULL, 10) : 24;
callt (v);
return 0;
}
void callt (const unsigned long v)
{
if (!v) { putchar ('0'); return; };
size_t sz = sizeof v * CHAR_BIT;
unsigned long rem = 0;
while (sz--)
if ((rem = v >> sz)) {
if (rem & 1) T1(); else T0();
}
}
示例使用/输出
$ ./bin/dec2bincallt
T1 called
T1 called
T0 called
T0 called
T0 called
$ ./bin/dec2bincallt 11
T1 called
T0 called
T1 called
T1 called
第二个将值的二进制表示的每一位存储为以nul 结尾的字符串并打印结果:
#include <stdio.h>
#include <stdlib.h>
#define BITS_PER_LONG 64 /* define as needed */
char *bincpy (char *s, unsigned long v, unsigned sz);
int main (int argc, char **argv) {
unsigned long v = argc > 1 ? strtoul (argv[1], NULL, 10) : 24;
char array[BITS_PER_LONG + 1] = "";
printf (" values in array: %s\n", bincpy (array, v, 16));
return 0;
}
/** copy 'sz' bits of the binary representation of 'v' to 's'.
* returns pointer to 's', on success, empty string otherwise.
* 's' must be adequately sized to hold 'sz + 1' bytes.
*/
char *bincpy (char *s, unsigned long v, unsigned sz)
{
if (!s || !sz) {
*s = 0;
return s;
}
if (!v) {
*s = '0';
*(s + 1) = 0;
return s;
}
unsigned i;
for (i = 0; i < sz; i++)
s[i] = (v >> (sz - 1 - i)) & 1 ? '1' : '0';
s[sz] = 0;
return s;
}
示例使用/输出
(填充到 16 位)
$ ./bin/dec2binarray
values in array: 0000000000011000
$ ./bin/dec2binarray 11
values in array: 0000000000001011