二进制交换位置,并输出的问题.

restartboy 2005-03-13 10:31:18
请教大家一个问题.
我从一个文件依次读出一个8字节的流.
怎么实现将他的二进制数据的位置改变.
比如我读出0x123456789abcdef
怎样将他的二进制数的第1位放到第58位,第2位放到第50位……第64位放到第7位,再以二进制输出。
谢谢。
...全文
170 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenery 2005-03-19
  • 打赏
  • 举报
回复
呵呵,你还没有结贴吧?还没有收到你的分哦。
wanzhigang 2005-03-18
  • 打赏
  • 举报
回复
int sur=0x123;
string s=Convert.ToString(sur,2);//转换成二进制字符串
byte [] bs=Encoding.Default.GetBytes(s);//放入byte数组
Array.Reverse(bs);//反转byte数组元素
s=Encoding.Default.GetString(bs);//反转后的结果放入字符串
int tar=Convert.ToInt32(s,2);//转换为数值
MessageBox.Show(s+" "+tar.ToString());
restartboy 2005-03-17
  • 打赏
  • 举报
回复
greenery你的分加上去了吗。怎么我给了分这里还是显示0分阿。
greenery 2005-03-14
  • 打赏
  • 举报
回复
好,再写
byte x = 0xD4;
byte y = 0;

y = checkAndLink((x & 0x01) , 0x04) // 第1位放到第3位
| checkAndLink((x & 0x02) , 0x80) // 第2位放到第8位
| checkAndLink((x & 0x04) , 0x02) //第3位放到第2位
.....

byte checkAndLink(byte p_byOld, byte p_byOffset)
{
if (p_byOld > 0)
return p_byOffset;
else
return 0;
}
restartboy 2005-03-13
  • 打赏
  • 举报
回复
to:greenery
你这样好像不行吧.
你是从右边开始算的第一位吧.
如果这样的话,我的例子11010100 变换后应该是01011010

按照你的方法,比如((x & 0x04) & 0x02) 先是把第3位取出来,变成00000100,但是00000100和0x02与是得00000000啊,而不是00000010。

再帮忙想象吧。还是谢过:)
greenery 2005-03-13
  • 打赏
  • 举报
回复
byte x = 0xD4;
byte y = 0;

y = ((x & 0x01) & 0x04) // 第1位放到第3位
| ((x & 0x02) & 0x80) // 第2位放到第8位
| ((x & 0x04) & 0x02) //第3位放到第2位
.....
大概是这样,你看看可否?
restartboy 2005-03-13
  • 打赏
  • 举报
回复
比如二进制11010100
第1位放到第3位,第2位放到第8位,第3位放到第2位,第4位放到第6位,第5位放到第7位,第6位放到第1位,第7位放到第4位,第8位放到第5位.
就变成 10100101
xxuu503 2005-03-13
  • 打赏
  • 举报
回复
有逻辑关系么?没有逻辑关系的话,你就按最啰嗦的方法写
somedummy 2005-03-13
  • 打赏
  • 举报
回复
这个……

描述得很不清楚,无法推导你想要干什么……
xiongchen 2005-03-13
  • 打赏
  • 举报
回复
UP
restartboy 2005-03-13
  • 打赏
  • 举报
回复
我1个字节这样做是对的。
但8个字节就不行了。
我用的long类型
跟踪
类似1<<40这样位数移得比较多的是错的。
有什么解决方法吗?

restartboy 2005-03-13
  • 打赏
  • 举报
回复
谢谢greenery的启发

int[] IP = {3,8,2,6,7,1,4,5};
int x = 0xD4;
int y =0;
for(int i=0;i<=7;i++)
{
if(i<=IP[i])
{
y = y|((x&(1<<7-i))>>(IP[i]-i-1));
}
else
y = y|((x&(1<<7-i))<<(i-IP[i]+1));

}
Console.WriteLine("{0:X}",y);

(ps 我是从左边算的第一位)
另外我想问问在执行移位操作时,计算机是一位一位的加0,还是一下算出0的个数再一起加。我上边的算法都有点时延,这还是1个字节,如果变成8个字节,会不会慢很多。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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