按位交换操作

时间:2011-11-17 09:25:33

标签: c# java c bit-manipulation

如果我们有两个位间隔的重叠,如何将给定整数{p, p+1, ..., p+k-1}的位与{q, q+1, ..., q+k-1}交换; p和q是位的位置:
 p != q; k > 1

示例:

p = 5;
q = 8;
k = 6;
16-bits decimal number 30 000 in binary representation:
01110101 00110000
================before exchange============
     101 001
  110101
================after exchange==============
     110 101
  101001
============================================

如何确定位的位置8,9和10,要放置哪些位 - 110或001?

2 个答案:

答案 0 :(得分:4)

如果允许重叠,算法必须是有损的。

从你的例子:

01110101 00110000
     |     |
     101 001
  |    |
  110101

如果交换它们,则值为:

01110101 00110000
     |     |
     110 101
     *** - Mismatch!
  |    |
  101001
     *** - Mismatch!

无论如何,如果您允许重叠,则无法保证在进行交换后您可以获得相同的原始值。

解决此问题的两种方法:

  • 记录您的功能有损,并且无法保证您能够将交换的位提取出来。
    我不喜欢这个想法,因为我不知道我会用什么算法
  • 如果将重叠输入算法,则抛出异常,并编写使用此算法的程序,使其不会产生重叠。

答案 1 :(得分:1)

在Java中,您可以使用以下方法检查所需位:

boolean isSet(byte number, int index) {
    return (number & (1 << index)) != 0;
}

要构造新字节,您可以使用:Byte.valueOf(string,radix)

此外,当您使用非字节数时,可以使用ByteBuffer(ByteOrder.LITTLE_ENDIAN / ByteOrder.BIG_ENDIAN)更改字节顺序