我想將二進制的每個字符放入它自己的 數組中。但是,我似乎無法保存我的字符串數組中的返回值的數字 。
有很多方法可以解決這個問題,如果我明白你在問什麼。首先,根據組成數字的任何給定位的位值,不需要將數字的二進制表示形式的結果實際存儲在數組中,以便調用T1()
或T0()
。
舉例24
(二進制11000
)。如果我正確地讀您的文章,你陳述:
在這種情況下,由於小數是24
,二進制 將11000
因此應執行的 功能T1()
2
時間和T0()
6
倍。
(我不知道你在哪裏得到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
到功能callt (24)
,輸出將是:
$ ./bin/dec2bincallt
T1 called
T1 called
T0 called
T0 called
T0 called
在另一方面,如果你確實想給二進制的每個字符到它自己的空間陣列內(在回答結束提供完整的例子),那麼你就只需要通過一個陣列捕獲位值(無論是'0'
和'1'
,或者只是0
和1
的ASCII字符表示),而不是調用T0
和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
爲每個0-bit
各1-bit
和T0
:
#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
變量不具有「十進制值」 - 除非使用數字系統,小數存儲器單元。不太可能,所有現代計算機都是**二進制**。而C不支持_methods_,只有_functions_。 – Olaf
退後一步,看看'decimalToBinary'實際做了什麼。這是我們的廢話。只要刪除整個身體和'返回n;'。沒有冒犯,但你真的搞砸了。它甚至不清楚你實際想要完成什麼。你知道'itoa'(小寫!),你似乎有不同的想法。 – Olaf
'char myStringG [8 + 1]; snprintf(myStringG,sizeof(myStringG),「%08ld」,binaryG);' – BLUEPIXY