二进制异或运算问题 ?高手快来!

ms2008 2008-04-27 12:53:18
二进制异或运算问题 ?

设计需要 :
000000000 到 111111111 共九位的二进制 要求把所有任意两个数“异或运算”结果罗列出来. 2的9次方=512 C 512选择2个的组合=130816次计算

但是我们也可以看出结果 最大是111111111,九个1 最小的是000000000
九个0,要求是统计出结果是 0000到1001( 比如异或结果是 “111111111”输出结果是 9个1 即用 1001表示它的结果;
异或结果是 “000000000”9个0没有“1”的出现用 0000表示它的结果,反之“000011101”输出结果4个1 即用 0100表示它的结果) 1的出现的个数 就是我们需要的结果.
比如:000000000^000000001=000000001 ;第一组计算 输出0001 (1个1)
................
000000000^111111111=111111111 ;输出1001 (9个1)
.......................
000000000^101101010=101101010 ;输出0101 (5个1)
.......................
111111110^111111111=000000001 ;第130816组计算 输出0001(1个1)
统计每组运算结果“1”的个数,用四位二进制输出表示 而不是它们异或的结果数值

要求能用编程语言:C++语言或者任意一种编程语言写出解决的方法.
附上解答的编程技巧和上面的答案结果 (可以用.txt文本,或者.doc world 格式上传结果)

...全文
623 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
geochway 2008-05-19
  • 打赏
  • 举报
回复
这种作业还是自己做的好,
这是学计算机语言最基本的训练.
  • 打赏
  • 举报
回复
顶LS
baihacker 2008-04-27
  • 打赏
  • 举报
回复

//这个是有结果的,自己运行
//注意一下result.txt的路径
#include <iostream>
#include <fstream>
using namespace std;
inline void show_bitcount32(unsigned int x, ostream& o)
{
static char tb[][5] = {
"0000","0001","0010","0011",
"0100","0101","0110","0111",
"1000","1001","1010","1011",
"1100","1101","1110","1111",
};
static int format = 0;
x = x - ((x >> 1) & 0x55555555UL);
x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);

x = (x + (x >> 4)) & 0x0f0f0f0fUL;
x += x >> 8;
x += x >> 16;

o << tb[x & 0x3f] << '\t';
if (!(++format%8)) o << endl;
}

int main()
{
fstream result;
result.open("result.txt", ios::out);
for (unsigned int i = 0; i < 0x200; ++i)
for (unsigned int j = 0; j < 0x200; ++j)
show_bitcount32(i^j, result);
result.close();
return 0;
}
wuyu637 2008-04-27
  • 打赏
  • 举报
回复
以2个0为例子,

00^00 = 00
00^01 = 01
00^10 = 10
00^11 = 11;


01^00 = 01
01^01 = 00
01^10 = 11
01^11 = 10;


10^00 = 10
10^01 = 11
10^10 = 00
10^11 = 01;

11^00 = 11
11^01 = 10
11^10 = 01
11^11 = 00;

其实可以得到一个规律,就是对于每一个数来说,
它和其他所有的数的异或的结果,正好是这个2^n的一个遍历。

所有只要就算一下,000000000-----111111111这些数的1的情况,再乘上一个2^9就是要的结果。。。
baihacker 2008-04-27
  • 打赏
  • 举报
回复
0x400改成0x200
baihacker 2008-04-27
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
void show_bitcount32(unsigned int x)
{
static char tb[][5] = {
"0000","0001","0010","0011",
"0100","0101","0110","0111",
"1000","1001","1010","1011",
"1100","1101","1110","1111",
};
x = x - ((x >> 1) & 0x55555555UL);
x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);

x = (x + (x >> 4)) & 0x0f0f0f0fUL;
x += x >> 8;
x += x >> 16;

cout << tb[x & 0x3f] << '\t';
}

int main()
{
for (unsigned int i = 0; i < 0x400; ++i)
for (unsigned int j = 0; j < 0x400; ++j)
show_bitcount32(i^j);
return 0;
}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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