c# - 按位交换操作

标签 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?

最佳答案

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

从你的例子:

01110101 00110000
     |     |
     101 001
  |    |
  110101

如果交换它们,则值为:

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

无论如何,如果你允许重叠,你不能保证在进行交换后得到相同的原始值。

解决这个问题的两种方法:

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

关于c# - 按位交换操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8164771/

相关文章:

c - 对 RasDialA 的 undefined reference (包含 ras.h)

java - 找不到类 java.util.concurrent.Executors

java - 如何在我的 Mac 上恢复 Java

c# - 将 C char[][] 数组编码到 C#

c# - 如何在 C# 中使用 LINQ to XML 检查 XDocument 中的属性是否存在

java - Tomcat 找不到 H2 内存数据库

c - 如何将变量传递给外部汇编函数

c - 在malloc C/C++之前,malloc无需类型转换即可工作

c# - 在 Windows 8 Store 应用程序中按回车键移动到下一个控件

c# - 您能否拥有一个从仅具有用户级权限的客户端应用程序链接的具有管理员权限的 DLL?