关于数组转换的问题

iceknife 2003-07-22 03:11:44
请问我有一个2维数组char buffer[3][2],我想把它每位转换与之对应的二进制数组即buffer2[3][8],那位大哥能给些提示呀,多谢了
...全文
40 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdocument 2003-07-23
  • 打赏
  • 举报
回复
char a[1][1] 的每一个元素都是单个字符,而“4f”已经是字符串了。
iceblade 2003-07-23
  • 打赏
  • 举报
回复
谢谢上面的各位大哥,最后一个问题,如果a[1][1]={'4f'}我怎么能得到b[1][8]=={0,1,0,0,1,1,1,1}马上就散分了,谢谢了
cdocument 2003-07-23
  • 打赏
  • 举报
回复
不敢说成熟高效,只能是实现了功能:请高手指点哈。
#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

const row=2;
const lin=2;

char source[16][4]={{'0','0','0','0'},{'0','0','0','1'},{'0','0','1','0'},{'0','0','1','1'},
{'0','1','0','0'},{'0','1','0','1'},{'0','1','1','0'},{'0','1','1','1'},{'1','0','0','0'},
{'1','0','0','1'},{'1','0','1','0'},{'1','0','1','1'},{'1','1','0','0'},{'1','1','0','1'},
{'1','1','1','0'},{'1','1','1','1'}};

int getnum(const char p)
{
char temp=p;
if (isxdigit(temp))
{
temp=toupper(p);
if (temp>='A')
return temp-'A'+10;
else
return temp-'0';
}
return -1;
}

void change(char sour[][lin], char dest[][lin*4])
{
try
{
for (int i=0; i<row; i++)
{
for (int j=0; j<lin; j++)
{
int num=getnum(sour[i][j]);
if (-1==num)
throw 0;
for (int k=0; k<4; k++)
{
dest[i][j*4+k]=source[num][k];
}
}
}
}
catch (...)
{
cout<<"cpp:error: you init the array with the char beyond xdigit"<<endl;
system("pause");
exit(0);
}
}
void main(void)
{
char a[row][lin]={ {'0','0'},{'A','B'}};
char b[row][lin*4];

change(a,b);

for (int i=0; i<row; i++)
{
for (int j=0; j<lin*4; j++)
cout<<setw(4)<<b[i][j];
cout<<endl;
}
system("pause");
}
iceblade 2003-07-23
  • 打赏
  • 举报
回复
to 风之箭,我们必须用turbo c来开发:-(;
forever1314 2003-07-23
  • 打赏
  • 举报
回复
用位运算
一个一个存
iceblade 2003-07-23
  • 打赏
  • 举报
回复
to document,:-)你说得很对,就是你的意思,我说的就是a的数组元素比较大,但是可以分段处理的,每次就是将一个a[3][2]的转换成b[3][18],但是总体上最多可以有上万个a[3][2].所以期待
高效成熟的算法。
zoezinsser 2003-07-23
  • 打赏
  • 举报
回复
学习ing
sailor_Song 2003-07-23
  • 打赏
  • 举报
回复
关注中
冰箭 2003-07-23
  • 打赏
  • 举报
回复
那你用类模板std::bitset吧,虽然不一定高效,但是非常好用的!
std::bitset<size> name(value) // 从无符号长整数数创建一个位集合
std::bitset<size> name(std, pos, n) // 从字符串创建位集合
cdocument 2003-07-23
  • 打赏
  • 举报
回复
我来将你的意思说一下,一直没有说清楚!^_^
将一个数组char a[row][lin] 转换成另外一个数组char b[row][4*lin],数组a中的元素都是十六进制字符,也就是‘0’......'9'....'F',其中字母不分大小写。
举例:
char a[2][2]={{'4','f'},{'a','7'}}转换后的数组是:
char b[2][8]={0 1 0 0 1,1,1,1
1,0,1,0,0,1,1,1}
你所谓的大量数据是否是说a数组的元素庞大?是否如此,请将你的问题说清楚。^_^
fixopen 2003-07-23
  • 打赏
  • 举报
回复
template<unsigned char byte>
class BITS_SET
{
public:
enum bit
{
B0 = (byte & 0x01) ? 1 : 0,
B1 = (byte & 0x02) ? 1 : 0,
B2 = (byte & 0x04) ? 1 : 0,
B3 = (byte & 0x08) ? 1 : 0,
B4 = (byte & 0x10) ? 1 : 0,
B5 = (byte & 0x20) ? 1 : 0,
B6 = (byte & 0x40) ? 1 : 0,
B7 = (byte & 0x80) ? 1 : 0
};
};

int main(void)
{
char buffer[2][3] = {/*any data*/};

char buffer2[2][3][8];
memset(buffer2, 0, sizeof(buffer2)); //clear the buffer2

for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
{
buffer2[i][j][0] = BIT_SET<buffer[i][j]>::B0;
//...
buffer2[i][j][7] = BIT_SET<buffer[i][j]>::B7;
}
}
}

效率够你用的了吧!
cdocument 2003-07-23
  • 打赏
  • 举报
回复

你不是说了是16进制字符吗? 我处理的只有:'0'....'9' 'a'....'f' 'A'....'F' 。其他的字符就被视为不正确,抛出异常退出了。呵呵,我觉得你的问题一直没有描述清楚哦!
a_ray1 2003-07-23
  • 打赏
  • 举报
回复
memcpy(buffer2,buffer1,sizeof(buffer1));
冰箭 2003-07-23
  • 打赏
  • 举报
回复
给字符赋值可以这样 a[1][1]= 0xea 而不是 {'ea'}
iceblade 2003-07-23
  • 打赏
  • 举报
回复
to 热心的document 大哥,如果按你的程序,是不是大于"F"就不能处理了?
iceblade 2003-07-22
  • 打赏
  • 举报
回复
位于运算以后逐个取出我是知道的,我希望一种高效的方法,因为牵扯到大量数据。谢谢了
cloudtarget 2003-07-22
  • 打赏
  • 举报
回复
是不是把每个字符转换为二进制形式存放?
冰箭 2003-07-22
  • 打赏
  • 举报
回复
给你一个提示吧
buf2[0][0] = (buf[0]&0x80)>0?1:0
njuhuangmy 2003-07-22
  • 打赏
  • 举报
回复
hehe

字符 本来 就是 存储 成 整型 的

你 那样做 到底 是 什么 意思 呢 ?

拿 一个 字节 来 放 一个 位 ??

呵呵, 用 位运算符 << >> //呵呵,没用错吧?

你的意思 只要 用 >> 分别 移位 之后,取 最后 一位 ,这个 用 位并 运算
iceblade 2003-07-22
  • 打赏
  • 举报
回复
大虾们快看看呀
加载更多回复(8)

69,369

社区成员

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

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