用C将一个256位数转成64位的方法,求实现!

To_be_sky 2013-10-28 10:53:19
组长叫我实现一个将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++,写了半天都没有写出完整的。
希望能有人帮我实现下。
不胜感激
...全文
470 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 16 楼 derekrose 的回复:
[quote=引用 15 楼 u011717322 的回复:] [quote=引用 14 楼 derekrose 的回复:] 256除6除不尽啊 每六位操作 移位就可以了啊,很简单的
我也知道是移位,但是你不知道到底最后要加几个0. 这个问题我再去问问组长, 感觉他说256说的是给的数最大是256位, 就是说我现在不知道这个数有多少位。 懂我的意思了吗?[/quote] 256好办 位数不确定就必须要给出终止条件[/quote] 恩!用移位来判断有多少位应该可以。 向右移,每次移1位,当为0时就是移完了,就可以知道一共多少位了。 谢谢了哈!
derekrose 2013-10-28
  • 打赏
  • 举报
回复
引用 15 楼 u011717322 的回复:
[quote=引用 14 楼 derekrose 的回复:] 256除6除不尽啊 每六位操作 移位就可以了啊,很简单的
我也知道是移位,但是你不知道到底最后要加几个0. 这个问题我再去问问组长, 感觉他说256说的是给的数最大是256位, 就是说我现在不知道这个数有多少位。 懂我的意思了吗?[/quote] 256好办 位数不确定就必须要给出终止条件
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 14 楼 derekrose 的回复:
256除6除不尽啊 每六位操作 移位就可以了啊,很简单的
我也知道是移位,但是你不知道到底最后要加几个0. 这个问题我再去问问组长, 感觉他说256说的是给的数最大是256位, 就是说我现在不知道这个数有多少位。 懂我的意思了吗?
derekrose 2013-10-28
  • 打赏
  • 举报
回复
256除6除不尽啊 每六位操作 移位就可以了啊,很简单的
图灵狗 2013-10-28
  • 打赏
  • 举报
回复
另外你可以用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]
图灵狗 2013-10-28
  • 打赏
  • 举报
回复
对于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]
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 10 楼 derekrose 的回复:
你的*位*指的是什么
就是bit。 这个你可以不管! 看看例如后面的吧! 例如后面的怎么实现。
derekrose 2013-10-28
  • 打赏
  • 举报
回复
你的*位*指的是什么
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 7 楼 lubyam 的回复:
没有看懂楼主的意思
就看例如后面的吧! 不用管256转64了。
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 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] 这个我都知道。 就是感觉不知道怎么得到一个数到底有多少位。
光流溢彩 2013-10-28
  • 打赏
  • 举报
回复
没有看懂楼主的意思
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
一个将256位的数转换为64位的数 这个具体是什么意思? 要截取前面的还是后面的?
不好意思,其实这个问题没说完, 但是具体的算法就是这个, 你就当没说256位转64位吧。 就是截取前面的6位,后面不足6位的在后面加0
图灵狗 2013-10-28
  • 打赏
  • 举报
回复
给你举个例子吧,比如有 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]
max_min_ 2013-10-28
  • 打赏
  • 举报
回复
一个将256位的数转换为64位的数 这个具体是什么意思? 要截取前面的还是后面的?
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 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位各位就当没说,主要是这个算法。 谢谢啊!
图灵狗 2013-10-28
  • 打赏
  • 举报
回复
需求再弄清楚一点吧,总的来说,你的问题只需要用数组和位运算就可以解决的。
引用 楼主 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++,写了半天都没有写出完整的。 希望能有人帮我实现下。 不胜感激
nice_cxf 2013-10-28
  • 打赏
  • 举报
回复
问题能描述清楚点么?256位的数转换为64位,应该是数据变短,而后边的例子,是数据变长。。。。
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 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分吧! 再次谢了!
光流溢彩 2013-10-28
  • 打赏
  • 举报
回复
引用 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的范围内,不然会出错
To_be_sky 2013-10-28
  • 打赏
  • 举报
回复
引用 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函数式做什么?
加载更多回复(8)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧