user-0 提问: unsigned long型数据转二进制

回复:
user: user-1
content: 引用 9 楼 zhao4zhong1 的回复:笑口常开，笑天下可笑之人。  按赵老湿往常的逻辑，似乎不是这样的。赵老湿的逻辑应当是我笑天下人，天下人亦笑我。

user: user-2
content: 笑口常开，笑天下可笑之人。

user: user-1
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 sholber 的回复:] 看到楼上有些人用的语言是C，而编程风格和编程习惯还停留在BASIC，哥决定再写一个新的版本： # include <limits.h>  # include <stddef.h>     typedef unsigned long INT32U;     void num_binary (INT32U vari, char * str)   {      for (size_t x = sizeof (INT32U) * CHAR_BIT; x > 0; x --)            * (str ++) = (vari >> x - 1 & 1) + '0';      * str = '\0';   } 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George [/quote]  赵老湿不但会用 C写一些看起来不像 C的代码，还擅长纸上谈兵啊。就一个计算2+3的程序，居然还扯上了设计模式和敏捷。还没参加乡试和殿试呢，就开始考虑如何当一个清官了，真是可笑。

user: user-2
content: 引用 6 楼 sholber 的回复:看到楼上有些人用的语言是C，而编程风格和编程习惯还停留在BASIC，哥决定再写一个新的版本： # include <limits.h>  # include <stddef.h>     typedef unsigned long INT32U;     void num_binary (INT32U vari, char * str)   {      for (size_t x = sizeof (INT32U) * CHAR_BIT; x > 0; x --)            * (str ++) = (vari >> x - 1 & 1) + '0';      * str = '\0';   } 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-1
content: 看到楼上有些人用的语言是C，而编程风格和编程习惯还停留在BASIC，哥决定再写一个新的版本： # include <limits.h>  # include <stddef.h>     typedef unsigned long INT32U;     void num_binary (INT32U vari, char * str)   {      for (size_t x = sizeof (INT32U) * CHAR_BIT; x > 0; x --)            * (str ++) = (vari >> x - 1 & 1) + '0';      * str = '\0';   }

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-3
content: 测试可用  #include <stdio.h> #include <stddef.h>  typedef unsigned long INT32U;  void num_binary (INT32U vari, char *str) {     INT32U temp = 1;     char c;     int i = sizeof(vari) * 8;     int m = 0;     printf("lenght of INT32U:%d\n",i);     for(m = 0; m < i; m++){         //printf("m = %d\n",m);         //c = (vari & temp) + '0';         //printf("c = %c\n",c);         int n = 0;         if(vari & temp)             n = 1;         *(str+m) = (char) ( n + '0');         temp = temp << 1;     }     *(str+i) = '\0'; }  int main(void) {     char *str = NULL;     int in;     str = (char*)malloc(100*sizeof(char));     INT32U i = 8858;     num_binary(i, str);     printf("i = %d is %s\n",i, str);      scanf("%d",&in);     num_binary(in,str);     printf("in = %d is %s\n",in, str);      free(str); //    printf("str = %.8s %.8s %.8s %.8s\n", *str,*str+8, *str+16, *str+32); }

user: user-4
content: 有bug char str[32]; 改为 char str[33];

user: user-4
content: 没什么问题：  typedef unsigned int INT32U; void Num_Binary(INT32U vari, char *str) { 	int i; 	//temp = vari; 	for (i = 31; i != -1; i--) 	{ 		*(str + i) = (vari & 1) + '0'; 		vari = vari >> 1; 		//temp2 = vari; 	} 	*(str + 32) = 0; } int main(void) { 	INT32U i = 32; 	char str[32]; 	Num_Binary(i, str); 	printf("str=%.8s %.8s %.8s %.8s\n", str, str + 8, str + 16, str + 24); 	return 0; } //00000000 00000000 00000000 00100000

user: user-1
content: # include <limits.h> # include <stddef.h>  typedef unsigned long INT32U;  void num_binary (INT32U vari, char * str)  {      union {INT32U v; unsigned c:1;} u;      for (size_t x = 0; x < sizeof (INT32U) * CHAR_BIT; x ++)         * (str ++) = (u.v = vari >> x, u.c + '0');     * str = '\0';  }