繁体   English   中英

按位交换操作

[英]Bitwise exchange operations

在有重叠的情况下,如何与{q, q+1, ..., q+k-1}交换给定整数{p, p+1, ..., p+k-1}的位两个比特间隔; p和q是位的位置:
p != q; k > 1 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?

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

从您的示例:

01110101 00110000
     |     |
     101 001
  |    |
  110101

如果交换它们,则值为:

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

无论如何,如果允许重叠,则不能保证交换后可以得到相同的原始值。

解决此问题的两种方法:

  • 记录您的函数有损,并且不能保证可以提取掉交换的位。
    我不喜欢这个主意,因为我不知道如何将这种算法用于
  • 如果将重叠输入到算法中,则会引发异常,并编写不使用重叠的方式使用该算法的程序。

在Java中,您可以使用以下命令检查所需的位:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM