如何使用按位运算符交错 2 个布尔值?

2024-04-04

假设我有两个 4 位值,ABCD and abcd。如何交错它,所以它变成AaBbCcDd,使用按位运算符?伪 C 语言示例:

nibble a = 0b1001;
nibble b = 0b1100;
char c = foo(a,b);
print_bits(c); 
// output: 0b11010010

注意:4 位仅用于说明,我想用两个 32 位整数来完成此操作。


这被称为完美洗牌操作,并且在《比特攻击圣经》中有详细讨论,黑客的喜悦 http://www.hackersdelight.org/作者:Henry Warren,第 7-2 节“洗牌位”。

假设x是一个 32 位整数a在其高阶 16 位和b其低 16 位:

   unsigned int x = (a << 16) | b;   /* put a and b in place */

下面简单的类似 C 的代码完成了完美的洗牌:

x = (x & 0x0000FF00) << 8 | (x >> 8) & 0x0000FF00 | x & 0xFF0000FF;
x = (x & 0x00F000F0) << 4 | (x >> 4) & 0x00F000F0 | x & 0xF00FF00F;
x = (x & 0x0C0C0C0C) << 2 | (x >> 2) & 0x0C0C0C0C | x & 0xC3C3C3C3;
x = (x & 0x22222222) << 1 | (x >> 1) & 0x22222222 | x & 0x99999999;

他还给出了一种替代形式,该形式在某些 CPU 上速度更快,并且(我认为)更加清晰和可扩展:

unsigned int t;  /* an intermediate, temporary variable */
t = (x ^ (x >> 8)) & 0x0000FF00;  x = x ^ t ^ (t << 8);
t = (x ^ (x >> 4)) & 0x00F000F0;  x = x ^ t ^ (t << 4);
t = (x ^ (x >> 2)) & 0x0C0C0C0C;  x = x ^ t ^ (t << 2);
t = (x ^ (x >> 1)) & 0x22222222;  x = x ^ t ^ (t << 1);

我看到您已编辑您的问题,要求从两个 32 位输入获取 64 位结果。我必须考虑如何扩展沃伦的技术。我认为这不会太难,但我必须考虑一下。如果其他人想从这里开始并提供 64 位版本,我很乐意为他们投票。

针对 64 位进行编辑

我以简单的方式将第二个解决方案扩展到 64 位。首先,我将每个常量的长度加倍。然后我在开头添加了一行来交换相邻的双字节并将它们混合。下面的 4 行与 32 位版本几乎相同,第一行交换了相邻的内容bytes并混合后,第二行下降为半字节,第三行下降为双位,最后一行下降为单位。

unsigned long long int t;  /* an intermediate, temporary variable */
t = (x ^ (x >> 16)) & 0x00000000FFFF0000ull;  x = x ^ t ^ (t << 16);
t = (x ^ (x >> 8))  & 0x0000FF000000FF00ull;  x = x ^ t ^ (t << 8);
t = (x ^ (x >> 4))  & 0x00F000F000F000F0ull;  x = x ^ t ^ (t << 4);
t = (x ^ (x >> 2))  & 0x0C0C0C0C0C0C0C0Cull;  x = x ^ t ^ (t << 2);
t = (x ^ (x >> 1))  & 0x2222222222222222ull;  x = x ^ t ^ (t << 1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用按位运算符交错 2 个布尔值? 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 异常与临时类型。什么情况下容易摔倒?

    我在从事 MVC 3 项目时正在阅读一本企业应用程序开发的书 我目前正在决定如何处理异常 以前我会让异常在堆栈中冒泡 然后在最高层处理它 这本书建议在域模型中创建一个临时类并返回它 例如 public sealed class Missin
  • 无法在第一次点击事件时提交表单

    好吧 我花了几个小时研究这个问题并扫描了整个 stackoverflow 但仍然不知道该怎么办 但真正让我抓狂的是 如此微不足道 世界上最简单的事情却行不通 所以 我现在拥有的是一个带有输入和按钮的表单
  • iOS 15.0 中已弃用“windows”

    我构建了一个在我的一些应用程序中适用的函数 以 pdf 文件形式共享文本 在一个新项目 iOS15 中 我想重用这个函数 但收到了贬值的消息 我不明白应该如何将代码更改为新的 UIWindow Scene windows 该消息显示在我的代
  • 不使用 Visual Studio 的 C# 中的 GUI

    好的 我是 C 新手 但我需要创建一个简单的 GUI 但我没有 Visual Studio 我使用 Geany 和 Mono 问题是 当我尝试通过 Google 找到以下代码时 using System using System Windo
  • urllib2 urlopen 的工作非常随机

    由于某些原因 我从以下 url 获取 JSON 数据的部分有时只能工作 有时它会返回 404 错误 并抱怨缺少 header 属性 如果我将其粘贴到网络浏览器上 它会 100 正常工作 所以我确信链接没有损坏或其他什么 我在 Python
  • 有没有一种简单的方法来使用不同的 Spring 版本?

    我想在我的 Spring Boot 项目中使用最新的 Spring 4 1 x 快照 有没有一种简单的方法来覆盖所有 Spring 依赖项的版本 或者我应该手动包含所有必需的 Spring 依赖项及其所需版本 原因是我想在 REST 服务中
  • 使用 Stacks Java 将中缀转换为 Postfix

    我正在尝试编写一个程序将中缀表达式转换为后缀表达式 我正在使用的算法如下 1 Create a stack 2 For each character t in the expression If t is an operand append
  • 如何用 Python 写入公开可用的 Google 工作表(未经授权)?

    我对不属于我的 Google 表格拥有完全编辑权限 我希望能够在没有 Google API 授权的情况下使用 Python 写入电子表格 我检查了几个可用的软件包 gdata gspread等 似乎他们都要求提供凭据 我还可以在未经授权的情
  • 自动创建 Cosmos 上的 Hive 表

    我有一个 Orion 上下文代理 我使用 cygnus 0 6 将数据发送到我的 Cosmos 帐户 Cygnus 使用我的 Cosmos 上的数据正确创建了 txt 文件 但它没有创建 hive 的表 我会通过 Hive 客户端查询我的数
  • 解密操作失败,查看内部异常

    我正在使用 Visual Studio 2017 和 NET Core 2 x 我已经建立了两个项目 第一个是后端 API https 本地主机 51637 https localhost 51637 第二个是前端网站 https 本地主机
  • 我嵌入 Java Applet 的对象标签有什么问题?

    这是我的对象标签
  • 如何让 Vim 理解 *.md 文件包含 Markdown 代码,而不是 Modula-2 代码? [复制]

    这个问题在这里已经有答案了 当我在 Vim 中编辑包含 Markdown 代码的 README md 并执行时 set filetype 命令 我明白了filetype markdown Markdown 语法正确突出显示 但是当我在 Vi
  • 如何检测用户是否运行 IE 6?

    我需要能够判断是否正在 IE 6 中查看页面 如何在 javascript 中执行此操作 同时忽略 7 8 或其他浏览器等版本 直接从马嘴 http msdn microsoft com en us library ms537509 asp
  • 是否可以/应该在 Scala 中添加/创建从 T 到 Option[T] 的隐式转换?

    这是一个让事情变得更高效的机会吗 对于程序员来说 我发现将事情包装起来有点烦人Some e g Some 5 像这样的事情怎么样 implicit def T2OptionT x T Option T if x null None else
  • 有没有办法将谷歌地图嵌入到输入的搜索中?

    我试图这样做 当用户在表单中选择一个国家 地区并单击 提交 时 它会将他们重定向到一个包含嵌入式谷歌地图小部件的页面 该小部件也显示他们之前选择的国家 地区 我已尽力解决这个问题 我在网上寻找解决方案 并尝试通过自定义嵌入网址并将国家 地区
  • 当 wsdl 将服务端口绑定定义为 https 和端口 80 时,PHP SOAP 请求失败的解决方法?

    我正在使用 php5 的肥皂扩展来使用 SOAP Web 服务 服务的 wsdl 是使用 Axis java2wsdl 生成的 生成过程中使用的任何选项都会导致端口绑定 url 列出为https xxx xxx xxx xxx 80 如果我
  • ruby 中的“||=”操作数代表什么[重复]

    这个问题在这里已经有答案了 可能的重复 在 Ruby 中是什么意思 https stackoverflow com questions 995593 what does mean in ruby 我这样测试 gt gt a 3 gt 3 g
  • Kotlin 中按钮状态的不同背景

    我的项目中有一个按钮 其工作原理如下 该按钮对于每种状态有 3 种不同的设计 禁用 state enabled false 启用 按下 如果未选择任何文件 此按钮将保持禁用状态 并且具有特定的设计 不过 当选择文件时 此按钮将启用并切换到不
  • Drupal 节点揭秘

    我是 Drupal 的新手 希望了解这个平台的工作原理 具体来说 我对 Node 对象感到困惑 这是什么东西 Content Type是怎么进来的 看起来整个 Drupal 就是节点 节点 节点 很想听听您的见解 当您第一次接触 Drupa
  • 如何使用按位运算符交错 2 个布尔值?

    假设我有两个 4 位值 ABCD and abcd 如何交错它 所以它变成AaBbCcDd 使用按位运算符 伪 C 语言示例 nibble a 0b1001 nibble b 0b1100 char c foo a b print bits