嗨,我对编码很新,我真的需要帮助。 基本上我有一个十进制值,我把它转换为二进制值。 使用这种方法
long decimalToBinary(long n)
{
int remainder;
long binary = 0, i = 1;
while(n != 0)
{
remainder = n%2;
n = n/2;
binary= binary + (remainder*i);
i = i*10;
}
return binary;
}
我想将二进制文件的每个字符放入数组中自己的空间。但是,我似乎无法保存字符串数组中返回值的数字。我认为这与将long转换为string有关,但我可能错了!这是我到目前为止所拥有的。 我不想使用sprintf();我不希望打印我只想要存储在其中的值的值,以便if条件可以读取它。任何帮助将不胜感激!
int decimalG = 24;
long binaryG = decimalToBinary(decimalG);
char myStringG[8] = {binaryG};
for( int i = 0; i<8; i++)
{
if (myStringG[i] == '1' )
{
T1();
}
else
{
T0();
}
}
在这种情况下,由于十进制数是24,二进制数将是11000,因此它应该执行函数T1(); 2次,T0()6次。但它没有这样做,我似乎无法找到将保存的值存储在数组中的答案 * Ps Itoa();功能也不是一种选择。提前致谢! :)
答案 0 :(得分:1)
由于帖子被标记arm
使用malloc()
可能不是最好的方法,尽管最简单。如果你坚持使用数组:
#include <stdio.h>
#include <stdlib.h>
int decimalToBinary(long n, char out[], int len)
{
long remainder;
// C arrays are zero based
len--;
// TODO: check if the input is reasonable
while (n != 0) {
// pick a bit
remainder = n % 2;
// shift n one bit to the right
// It is the same as n = n/2 but
// is more telling of what you are doing:
// shifting the whole thing to the right
// and drop the least significant bit
n >>= 1;
// Check boundaries! Always!
if (len < 0) {
// return zero for "Fail"
return 0;
}
// doing the following four things at once:
// cast remainder to char
// add the numerical value of the digit "0"
// put it into the array at place len
// decrement len
out[len--] = (char) remainder + '0';
}
// return non-zero value for "All OK"
return 1;
}
// I don't know what you do here, but it
// doesn't matter at all for this example
void T0()
{
fputc('0', stdout);
}
void T1()
{
fputc('1', stdout);
}
int main()
{
// your input
int decimalG = 24;
// an array able to hold 8 (eight) elements of type char
char myStringG[8];
// call decimalToBinary with the number, the array and
// the length of that array
if (!decimalToBinary(decimalG, myStringG, 8)) {
fprintf(stderr, "decimalToBinary failed\n");
exit(EXIT_FAILURE);
}
// Print the whole array
// How to get rid of the leading zeros is left to you
for (int i = 0; i < 8; i++) {
if (myStringG[i] == '1') {
T1();
} else {
T0();
}
}
// just for the optics
fputc('\n', stdout);
exit(EXIT_SUCCESS);
}
计算所需的长度很棘手,但如果您知道Micro使用的long
的大小(这些天是8,16,32甚至64位),您可以将其作为阵列的最大大小。留下前导零,但这应该不是问题,或者是它?
答案 1 :(得分:0)
使用itoa
(integer-to-ascii)函数。
http://www.cplusplus.com/reference/cstdlib/itoa/
编辑:更正:
不要成为白痴,请使用itoa
(整数到ascii)函数。
http://www.cplusplus.com/reference/cstdlib/itoa/
编辑:
也许我不够清楚。我看到了这句话:
* Ps Itoa();功能也不是一种选择。
这是完全不合理的。你想重新发明轮子,但你想要别人这样做吗?你对itoa有什么看法?这是标准的一部分。无论您使用的是什么平台或C版本,它都将永远存在。
答案 2 :(得分:0)
要实现目标,您不必将十进制值转换为二进制值:
unsigned decimalG = 24; // Assumed positive, for negative values
// have implementation-defined representation
for (; decimalG; decimalG >>= 1) {
if(decimalG & 1) {
// Do something
} else {
// Do something else
}
}
或者你可以使用联盟,但我不确定这种方法是否由标准明确定义。
如果您坚持写decimalToBinary
,请注意您必须使用数组:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
char *decimalToBinary(unsigned n);
int
main(void) {
int decimalG = 15;
char *binary = decimalToBinary(decimalG);
puts(binary);
free(binary);
}
char *
decimalToBinary(unsigned n) {
// Don't forget to free() it after use!!!
char *binary = malloc(sizeof(unsigned) * CHAR_BIT + 1);
if(!binary) return 0;
size_t i;
for (i = 0; i < sizeof(unsigned) * CHAR_BIT; i++) {
binary[i] = '0' + ((n >> i) & 1); // in reverse order
}
binary[i] = 0;
return binary;
}
答案 3 :(得分:0)
我想将二进制文件的每个字符都放入其中 数组中的空间。但是,我似乎无法保存数字 来自我的字符串数组中的返回值。
如果我理解你的要求,有很多方法可以解决这个问题。首先,不需要将数字的二进制表示的结果实际存储在数组中,以根据构成数字的任何给定位的位值来调用T1()
或T0()
。 / p>
举例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'
的ASCII字符表示,或0
和1
)而不是调用T0
和T1
(如果要将数组用作字符串,还可以添加几行来处理v=0
以及 nul-terminatedating 字符)例如:
/** 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
调用1-bit
,为每个T0
调用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-terminated 字符串并打印结果:
#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