不使用循环按位反转整数

2023-12-31

我想编写一个程序来反转整数的位。
例如 11000101 至 10100011
我知道如何使用循环来解决这个问题,但我遇到了使用字节移位来解决这个问题的解决方案:

num>>4|num<<4

我不明白这是如何工作的。有人可以帮我解决这个问题吗?


这不是反转位,而是交换半字节(4 位单元)。换句话说,它将变成:

1100 0101 (abcd efgh)

into:

0101 1100 (efgh abcd)

仅当数据类型实际上是 8 位时才会这样做(否则num << 4将一些位放置在最右边的八个位的左侧。更安全的方法是确保在移位之前清除所有其他位:

((num & 0xf0) >> 4) | ((num & 0x0f) << 4)

有关按位运算符如何工作的详细信息,请参阅这个优秀的答案 https://stackoverflow.com/questions/1746613/bitwise-operation-and-usage/1746642#1746642.

全位反转的等效表达式,hgfe dcba,是相当可怕的:

  ((num & 0x01) << 7)
| ((num & 0x02) << 5)
| ((num & 0x04) << 3)
| ((num & 0x08) << 1)
| ((num & 0x10) >> 1)
| ((num & 0x20) >> 3)
| ((num & 0x40) >> 5)
| ((num & 0x80) >> 7)

它提取并移位八位中的每一位。

还有一些优化可以在一个操作中处理一组不连续的位,例如:

num = ((num & 0xf0) >> 4) | ((num & 0x0f) << 4) // abcdefgh -> efghabcd
num = ((num & 0xcc) >> 2) | ((num & 0x33) << 2) // efghabcd -> ghefcdab
num = ((num & 0xaa) >> 1) | ((num & 0x55) << 1) // ghefcdab -> hgfedcba

这些工作原理是抓取不连续的位并将它们向左或向右移动,掩码值显示哪些位受到影响:

0xf0, 0x0f -> 1111-0000, 0000-1111, shift by 4
0xcc, 0x33 -> 1100-1100, 0011-0011, shift by 2
0xaa, 0x55 -> 1010-1010, 0101-0101, shift by 1

每行中的第一个位掩码提取要右移的位,第二个位掩码抓取要左移的位。然后将两个结果重新组合。以第二个为例,假设你有位abcdefgh事先评估表达式((num & 0xcc) >> 2) | ((num & 0x33) << 2):

(num&0xcc)>>2     (num&0x33)<<2
-------------     -------------
  abcdefgh          abcdefgh
  11001100          00110011        'and' with mask
  --------          --------
  ab00ef00          00cd00gh
  00ab00ef          cd00gh00        shift right/left
          \        /
           00ab00ef
           cd00gh00                 'or' them together
           --------
           cdabghef

因此,您可以看到位提取、移位和重组操作如何允许您反转值内各部分的顺序:

ab   cd   ef   gh
  \ /       \ /
   X         X
  / \       / \
cd   ab   gh   ef

我建议你尝试与第三次操作类似的实验num = ((num & 0xaa) >> 1) | ((num & 0x55) << 1),您会看到它也按预期运行,反转每组两个中的各个位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不使用循环按位反转整数 的相关文章

  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我

随机推荐

  • Angular.json 脚本未加载

    我正在尝试使用bootstrap导航栏的示例来自bootstrap文档 如果我从以下位置加载它angular json切换汉堡不起作用 如果我使用的是来自的 CDN 链接bootstrap docs
  • 要求文件作为字符串

    我正在使用 Node Express 我只是想知道如何将任何文件作为字符串导入 假设我有一个 txt 文件 我想要的只是将其加载到这样的变量中 var string require words txt 我反对 modules exports
  • Android 模拟器 - 创建用户帐户时遇到问题

    我的 Android 模拟器中需要一两个用户帐户 以便我可以测试应用程序的一些短信 邮件功能 问题是 当我尝试在模拟器中执行此操作时 设置 gt 帐户和同步 gt 添加帐户 gt my gmail account password gt 下
  • AngularJS Protractor - 如何测试 AJAX 登录调用?

    我有一个按钮 单击后会在 Angular 中发出 AJAX 调用 promise格式 登录成功后会出现 scope变量被更改并且元素如下所示 section Section to display if logged in section 被
  • 安装 Oracle Database Express Edition 11g 时出现问题

    我正在尝试使用 X ubuntu 13 04 64 位安装 Oracle 数据库本指南 http www techienote com 2012 11 step by step guide to install oracle databas
  • 使用 jdk 1.7 启动 Apache James

    我尝试在 Linux Mint 64 位 Debian 上使用 Java jdk 1 7u17 运行 apache james 3 0 beta4 服务器 但由于 JAXB 库错误而无法工作 根据文档 应下载不同的 jar 文件 http
  • 8086组装师

    我在下面的代码中遇到了这个问题 该代码将数字转换为 ASCII 数字文本 然而 代码似乎在 div 操作码处循环 Main Program main mov ax 0x0000 mov ds ax setup data segment re
  • 使用 JSONPath 进行 Redshift COPY 缺失的数组/字段

    我正在使用 COPY 命令将 JSON 数据集从 S3 加载到 Redshift 表 数据正在部分加载 但它会忽略缺少数据 键值 数组 的记录 即从下面的示例中仅加载第一条记录 Query 从 s3 mybucket address jso
  • 无符号整数的差异 - 获取签名结果的标准支持方法?

    假设两个任意时间戳 uint32 t timestamp1 uint32 t timestamp2 除了转换为更大的有符号类型和相当冗长的 if else 的明显变体之外 是否有标准的一致方法来获得两者的有符号差异 事先不知道哪一个更大 但
  • 研究squashfs压缩比

    是否有任何工具可以检查现有的 squashfs 映像并找出每个文件的压缩率 如果它可以帮助我估计一个巨大的可执行文件中静态链接符号的闪存使用情况 那就加分了 7zip 程序可以提供该信息 使用7z l slt squasfsfile您将获得
  • selenium切换到iframe来定位元素

    selenium import webdriver from selenium webdriver support import expected conditions as EC from selenium webdriver suppo
  • 如何通过 BFS 和 DFS 遍历构建树

    我有BFS and DFS树的遍历 如何从这些遍历中重建树 例如 BFS Traversal 4 3 5 1 2 8 7 6 DFS Traversal 4 3 1 7 2 6 5 8 那么树就会像下面这样 4 3 5 2 1 8 6 7
  • 创建 SOCK_RAW 套接字仅用于发送数据而不使用任何 recvform()

    如果我创建一个类型为 SOCK RAW 的套接字只是为了发送一些数据而不接收任何数据 那么当内核继续接收网络数据包并将其数据报复制到某个缓冲区 应用程序的 时 是否会出现任何问题 换句话说 somebuffer被填满后会发生什么 错误或忽略
  • MySQL 分组依据和跳过对空值的分组

    select from dc deal group by collection id 在 collection id 列中我有值 1 3 3 4 4 5 空 空 上面的查询将返回行 1 2 3 4 空 但我想跳过对 NULL 值的分组并需要
  • HierarchyID:获取父母列表的所有后代 - 不起作用

    我正在处理这个线程 HierarchyID HierarchyID 获取父母列表的所有后代 https stackoverflow com questions 25079528 hierarchyid get all descendants
  • jQuery:将层次结构序列化为 Json

    假设我有一个嵌套的无序列表 我想将其序列化为 json 使用 jQuery 实现此目的的最佳方法是什么 如果有人需要的话 这是解决方案 document ready function var root root var jsonObj js
  • ReactJS - {this.props.children} 未定义

    我看过很多与此论点相关的帖子 但我无法理解为什么 this props children 在我的应用程序中未定义 我对 ReactJS 很陌生 从 开始App js这是我的主要组成部分我有这个 import React Component
  • 具有动态表单的 Django FormWizard

    我想实现一个简单的两部分 FormWizard 表格 1 将动态生成如下内容 class BuyAppleForm forms Form creditcard forms ChoiceField widget forms RadioSele
  • 安卓;地理编码器,为什么我收到“服务不可用”?

    我想在 Android 应用程序中使用地理编码器 我有以下代码片段来对其进行采样 public class LocatorGeo extends Activity Called when the activity is first crea
  • 不使用循环按位反转整数

    我想编写一个程序来反转整数的位 例如 11000101 至 10100011我知道如何使用循环来解决这个问题 但我遇到了使用字节移位来解决这个问题的解决方案 num gt gt 4 num lt lt 4 我不明白这是如何工作的 有人可以帮