user-0 提问: 用C将一个256位数转成64位的方法，求实现！

回复:
user: user-0
content: 引用 16 楼 derekrose 的回复:[quote=引用 15 楼 u011717322 的回复:] [quote=引用 14 楼 derekrose 的回复:] 256除6除不尽啊  每六位操作 移位就可以了啊，很简单的 我也知道是移位，但是你不知道到底最后要加几个0. 这个问题我再去问问组长， 感觉他说256说的是给的数最大是256位， 就是说我现在不知道这个数有多少位。 懂我的意思了吗？[/quote]  256好办 位数不确定就必须要给出终止条件[/quote] 恩！用移位来判断有多少位应该可以。 向右移，每次移1位，当为0时就是移完了，就可以知道一共多少位了。 谢谢了哈！

user: user-1
content: 引用 15 楼 u011717322 的回复:[quote=引用 14 楼 derekrose 的回复:] 256除6除不尽啊  每六位操作 移位就可以了啊，很简单的 我也知道是移位，但是你不知道到底最后要加几个0. 这个问题我再去问问组长， 感觉他说256说的是给的数最大是256位， 就是说我现在不知道这个数有多少位。 懂我的意思了吗？[/quote]  256好办 位数不确定就必须要给出终止条件

user: user-0
content: 引用 14 楼 derekrose 的回复:256除6除不尽啊  每六位操作 移位就可以了啊，很简单的 我也知道是移位，但是你不知道到底最后要加几个0. 这个问题我再去问问组长， 感觉他说256说的是给的数最大是256位， 就是说我现在不知道这个数有多少位。 懂我的意思了吗？

user: user-1
content: 256除6除不尽啊  每六位操作 移位就可以了啊，很简单的

user: user-2
content: 另外你可以用sizeof去测试你的类型到底是多少位，例如： unsigned int a;  int bits = sizeof(a) * 8;  引用 8 楼 u011717322 的回复:[quote=引用 5 楼 turingo 的回复:] 给你举个例子吧，比如有 unsigned char a; unsigned char b;  你需要把a的高6位放到低位，b的低2位放到高位，组成新的 unsigned char c;  那么可以很简单的这样运算： c = ((a >> 2) & 0x3f) | ((b << 6) & 0xc0);  如果没有用过位运算的话，那么建议先去了解一下位运算的基本法则  [quote=引用 3 楼 u011717322 的回复:] [quote=引用 2 楼 turingo 的回复:] 需求再弄清楚一点吧，总的来说，你的问题只需要用数组和位运算就可以解决的。  [quote=引用 楼主 u011717322 的回复:] 组长叫我实现一个将256位的数转换为64位的数！ 大概的方法是：将256的数提取前6位，组合成新的数。 例如：0xC1 0xF5 0x41（1100 0001 1111 0101 0100 0001）转变成：      110000 011111 010101 000001，这样就变成了0X30 0X1F 0x15 0x01 再例如：0x31（0011 0001）转变成001100 010000，变成0x0C 0x10   大概就是这样的个情况！ 本人C语言写的不是很多，以前都是搞搞C++，写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激！[/quote] 这个是具体的算法。后面还要转！不过后面的要简单点了。 就是这个左移6位写了半天没写出来。 256位转64位各位就当没说，主要是这个算法。 谢谢啊！[/quote][/quote] 这个我都知道。 就是感觉不知道怎么得到一个数到底有多少位。[/quote]

user: user-2
content: 对于32位平台，一般来说： unsigned int 是 32位 unsigned short 是 16位 unsigned char 是 8位  引用 8 楼 u011717322 的回复:[quote=引用 5 楼 turingo 的回复:] 给你举个例子吧，比如有 unsigned char a; unsigned char b;  你需要把a的高6位放到低位，b的低2位放到高位，组成新的 unsigned char c;  那么可以很简单的这样运算： c = ((a >> 2) & 0x3f) | ((b << 6) & 0xc0);  如果没有用过位运算的话，那么建议先去了解一下位运算的基本法则  [quote=引用 3 楼 u011717322 的回复:] [quote=引用 2 楼 turingo 的回复:] 需求再弄清楚一点吧，总的来说，你的问题只需要用数组和位运算就可以解决的。  [quote=引用 楼主 u011717322 的回复:] 组长叫我实现一个将256位的数转换为64位的数！ 大概的方法是：将256的数提取前6位，组合成新的数。 例如：0xC1 0xF5 0x41（1100 0001 1111 0101 0100 0001）转变成：      110000 011111 010101 000001，这样就变成了0X30 0X1F 0x15 0x01 再例如：0x31（0011 0001）转变成001100 010000，变成0x0C 0x10   大概就是这样的个情况！ 本人C语言写的不是很多，以前都是搞搞C++，写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激！[/quote] 这个是具体的算法。后面还要转！不过后面的要简单点了。 就是这个左移6位写了半天没写出来。 256位转64位各位就当没说，主要是这个算法。 谢谢啊！[/quote][/quote] 这个我都知道。 就是感觉不知道怎么得到一个数到底有多少位。[/quote]

user: user-0
content: 引用 10 楼 derekrose 的回复:你的*位*指的是什么 就是bit。 这个你可以不管！ 看看例如后面的吧！ 例如后面的怎么实现。

user: user-1
content: 你的*位*指的是什么

user: user-0
content: 引用 7 楼 lubyam 的回复:没有看懂楼主的意思 就看例如后面的吧！ 不用管256转64了。

user: user-0
content: 引用 5 楼 turingo 的回复:给你举个例子吧，比如有 unsigned char a; unsigned char b;  你需要把a的高6位放到低位，b的低2位放到高位，组成新的 unsigned char c;  那么可以很简单的这样运算： c = ((a >> 2) & 0x3f) | ((b << 6) & 0xc0);  如果没有用过位运算的话，那么建议先去了解一下位运算的基本法则  [quote=引用 3 楼 u011717322 的回复:] [quote=引用 2 楼 turingo 的回复:] 需求再弄清楚一点吧，总的来说，你的问题只需要用数组和位运算就可以解决的。  [quote=引用 楼主 u011717322 的回复:] 组长叫我实现一个将256位的数转换为64位的数！ 大概的方法是：将256的数提取前6位，组合成新的数。 例如：0xC1 0xF5 0x41（1100 0001 1111 0101 0100 0001）转变成：      110000 011111 010101 000001，这样就变成了0X30 0X1F 0x15 0x01 再例如：0x31（0011 0001）转变成001100 010000，变成0x0C 0x10   大概就是这样的个情况！ 本人C语言写的不是很多，以前都是搞搞C++，写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激！[/quote] 这个是具体的算法。后面还要转！不过后面的要简单点了。 就是这个左移6位写了半天没写出来。 256位转64位各位就当没说，主要是这个算法。 谢谢啊！[/quote][/quote] 这个我都知道。 就是感觉不知道怎么得到一个数到底有多少位。

user: user-3
content: 没有看懂楼主的意思

user: user-0
content: 引用 4 楼 max_min_ 的回复:一个将256位的数转换为64位的数  这个具体是什么意思？ 要截取前面的还是后面的？ 不好意思，其实这个问题没说完， 但是具体的算法就是这个， 你就当没说256位转64位吧。 就是截取前面的6位，后面不足6位的在后面加0

user: user-2
content: 给你举个例子吧，比如有 unsigned char a; unsigned char b;  你需要把a的高6位放到低位，b的低2位放到高位，组成新的 unsigned char c;  那么可以很简单的这样运算： c = ((a >> 2) & 0x3f) | ((b << 6) & 0xc0);  如果没有用过位运算的话，那么建议先去了解一下位运算的基本法则  引用 3 楼 u011717322 的回复:[quote=引用 2 楼 turingo 的回复:] 需求再弄清楚一点吧，总的来说，你的问题只需要用数组和位运算就可以解决的。  [quote=引用 楼主 u011717322 的回复:] 组长叫我实现一个将256位的数转换为64位的数！ 大概的方法是：将256的数提取前6位，组合成新的数。 例如：0xC1 0xF5 0x41（1100 0001 1111 0101 0100 0001）转变成：      110000 011111 010101 000001，这样就变成了0X30 0X1F 0x15 0x01 再例如：0x31（0011 0001）转变成001100 010000，变成0x0C 0x10   大概就是这样的个情况！ 本人C语言写的不是很多，以前都是搞搞C++，写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激！[/quote] 这个是具体的算法。后面还要转！不过后面的要简单点了。 就是这个左移6位写了半天没写出来。 256位转64位各位就当没说，主要是这个算法。 谢谢啊！[/quote]

user: user-4
content: 一个将256位的数转换为64位的数  这个具体是什么意思？ 要截取前面的还是后面的？

user: user-0
content: 引用 2 楼 turingo 的回复:需求再弄清楚一点吧，总的来说，你的问题只需要用数组和位运算就可以解决的。  [quote=引用 楼主 u011717322 的回复:] 组长叫我实现一个将256位的数转换为64位的数！ 大概的方法是：将256的数提取前6位，组合成新的数。 例如：0xC1 0xF5 0x41（1100 0001 1111 0101 0100 0001）转变成：      110000 011111 010101 000001，这样就变成了0X30 0X1F 0x15 0x01 再例如：0x31（0011 0001）转变成001100 010000，变成0x0C 0x10   大概就是这样的个情况！ 本人C语言写的不是很多，以前都是搞搞C++，写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激！[/quote] 这个是具体的算法。后面还要转！不过后面的要简单点了。 就是这个左移6位写了半天没写出来。 256位转64位各位就当没说，主要是这个算法。 谢谢啊！

user: user-2
content: 需求再弄清楚一点吧，总的来说，你的问题只需要用数组和位运算就可以解决的。  引用 楼主 u011717322 的回复:组长叫我实现一个将256位的数转换为64位的数！ 大概的方法是：将256的数提取前6位，组合成新的数。 例如：0xC1 0xF5 0x41（1100 0001 1111 0101 0100 0001）转变成：      110000 011111 010101 000001，这样就变成了0X30 0X1F 0x15 0x01 再例如：0x31（0011 0001）转变成001100 010000，变成0x0C 0x10   大概就是这样的个情况！ 本人C语言写的不是很多，以前都是搞搞C++，写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激！

user: user-5
content: 问题能描述清楚点么？256位的数转换为64位，应该是数据变短，而后边的例子，是数据变长。。。。

user: user-0
content: 引用 27 楼 lubyam 的回复:[quote=引用 25 楼 u011717322 的回复:] [quote=引用 23 楼 lubyam 的回复:] [quote=引用 22 楼 lubyam 的回复:]  仅供参考 不知道是不是楼主要的· #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>  int main(int argc,char *argv[]) { 	int a,i,count,*num,j=0,k=0; 	int m=1; 	int n=0;  	char buf[100]={0},buf1[100]={0}; 	scanf("%x",&a); 	itoa(a,buf,2); 	if(strlen(buf)%4!=0) 	{ 		count=(strlen(buf)/4+1)*4%strlen(buf); 		memcpy(buf+count,buf,strlen(buf)); 		for (i=0;i<count;i++) 		{ 			buf[i]='0'; 		} 	}  	if (strlen(buf)%6!=0) 	{ 		a=a<<( (strlen(buf)/6+1)*2%(strlen(buf))); 	} 	itoa(a,buf,2); 	if(strlen(buf)%4!=0) 	{ 		count=(strlen(buf)/4+1)*4%strlen(buf); 		memcpy(buf+count,buf,strlen(buf)); 		for (i=0;i<count;i++) 		{ 			buf[i]='0'; 		} 	} 	 	num=(int *)malloc(strlen(buf)/6); 	memset(num,0,strlen(buf)/6); 	for (i=0;i<strlen(buf)/6;i++) 	{ 		num[i]=0; 	} 	i=0; 	j=5; 	while(buf[k]!='\0') 	{ 		count=pow(2.0,j); 		num[i]+=(buf[k]-'0')*count; 		j--; 		k++; 		if (j==-1) 		{ 			i++; 			j=5; 		} 	} 	for (i=0;i<strlen(buf)/6;i++) 	{ 		printf("%x \n",num[i]); 	} 	return 0; }    for (i=0;i<strlen(buf)/6;i++)    {        printf("%02x \n",num[i]);    }   如果要在前面补0的话可以向上面那么写[/quote] 刚刚运行了下！果然是对的啊！好犀利啊！ 太感谢了啊！ 我看你很多位置*4%strlen(buf);或者*2%strlen(buf);这个不是很懂！ 能讲下你的思路吗？ 太感谢你了！ 我写了半天都写不对！[/quote]   POW是系统的函数pow(x,y) 求x的y次幂。  思路大概是这样的。。  先输入一个 16进制的数，然后转换为2进制的。      if(strlen(buf)%4!=0)     {         count=(strlen(buf)/4+1)*4%strlen(buf);         memcpy(buf+count,buf,strlen(buf));         for (i=0;i<count;i++)         {             buf[i]='0';         }     }  这里是因为itoa会去掉2进制前面的0，所以得把前面的0补上    if (strlen(buf)%6!=0)     {         a=a<<( (strlen(buf)/6+1)*2%(strlen(buf)));     } 这里是 4位转6位然后补0   有一个缺点就是，输入的16进制数要在int的范围内，不然会出错[/quote] 知道了！ 太犀利了！ 怎么不知道谢好! 给你50分吧！ 再次谢了！

user: user-3
content: 引用 25 楼 u011717322 的回复:[quote=引用 23 楼 lubyam 的回复:] [quote=引用 22 楼 lubyam 的回复:]  仅供参考 不知道是不是楼主要的· #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>  int main(int argc,char *argv[]) { 	int a,i,count,*num,j=0,k=0; 	int m=1; 	int n=0;  	char buf[100]={0},buf1[100]={0}; 	scanf("%x",&a); 	itoa(a,buf,2); 	if(strlen(buf)%4!=0) 	{ 		count=(strlen(buf)/4+1)*4%strlen(buf); 		memcpy(buf+count,buf,strlen(buf)); 		for (i=0;i<count;i++) 		{ 			buf[i]='0'; 		} 	}  	if (strlen(buf)%6!=0) 	{ 		a=a<<( (strlen(buf)/6+1)*2%(strlen(buf))); 	} 	itoa(a,buf,2); 	if(strlen(buf)%4!=0) 	{ 		count=(strlen(buf)/4+1)*4%strlen(buf); 		memcpy(buf+count,buf,strlen(buf)); 		for (i=0;i<count;i++) 		{ 			buf[i]='0'; 		} 	} 	 	num=(int *)malloc(strlen(buf)/6); 	memset(num,0,strlen(buf)/6); 	for (i=0;i<strlen(buf)/6;i++) 	{ 		num[i]=0; 	} 	i=0; 	j=5; 	while(buf[k]!='\0') 	{ 		count=pow(2.0,j); 		num[i]+=(buf[k]-'0')*count; 		j--; 		k++; 		if (j==-1) 		{ 			i++; 			j=5; 		} 	} 	for (i=0;i<strlen(buf)/6;i++) 	{ 		printf("%x \n",num[i]); 	} 	return 0; }    for (i=0;i<strlen(buf)/6;i++)    {        printf("%02x \n",num[i]);    }   如果要在前面补0的话可以向上面那么写[/quote] 刚刚运行了下！果然是对的啊！好犀利啊！ 太感谢了啊！ 我看你很多位置*4%strlen(buf);或者*2%strlen(buf);这个不是很懂！ 能讲下你的思路吗？ 太感谢你了！ 我写了半天都写不对！[/quote]   POW是系统的函数pow(x,y) 求x的y次幂。  思路大概是这样的。。  先输入一个 16进制的数，然后转换为2进制的。      if(strlen(buf)%4!=0)     {         count=(strlen(buf)/4+1)*4%strlen(buf);         memcpy(buf+count,buf,strlen(buf));         for (i=0;i<count;i++)         {             buf[i]='0';         }     }  这里是因为itoa会去掉2进制前面的0，所以得把前面的0补上    if (strlen(buf)%6!=0)     {         a=a<<( (strlen(buf)/6+1)*2%(strlen(buf)));     } 这里是 4位转6位然后补0   有一个缺点就是，输入的16进制数要在int的范围内，不然会出错

user: user-0
content: 引用 23 楼 lubyam 的回复:[quote=引用 22 楼 lubyam 的回复:]   for (i=0;i<strlen(buf)/6;i++)    {        printf("%02x \n",num[i]);    }   如果要在前面补0的话可以向上面那么写[/quote] 看懂*4strlen(buf)和*2strlen(buf)做什么了，是为了补齐添加0. 最后问下Pow函数式做什么？