热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将64位整数中的每个其他位与32位整数进行比较

如何解决《将64位整数中的每个其他位与32位整数进行比较》经验,为你挑选了1个好方法。

我正在玩弄创建一个小的跳棋解算器的想法.首先,我将制作一个非常紧凑的跳棋板表示,然后继续构建游戏树等.

标准的检查板有8行,4个功能列(检查器只能移动对角线).这给了我们32个职位!每个位置需要的信息... 3位king位,和color位...所以00无王黑,01无王冲,10王黑,11王冲.这给了我们64这是一个很好的数字(长整数的精确大小).

但是,每个检查器还需要一个额外的位...该isOccupied位,因为每个检查器位置可以为空,或者填充上述四种状态之一.我决定采用64个状态并将它们放入一个长64位int,并将32个占用状态并将它们放入一个32位整数.

所以现在我们有一些背景知识,我有以下问题:我想轻易说"这块板上有多少个红色检查器?" 那不是那么糟糕......我们的64位整数包含这样的数据:

king_color_king_color_king_color所以011001意味着我们有红色,黑色的国王,红色.

为了得到颜色信息,我们可以使用01010101 ... 01的位掩码,它是十六进制的0x5555555555555555.这会将国王的位置归零,只留下颜色位.因此,在使用掩码进行AND运算后的011001示例中,我们有010001.如果我们计算位数(popcount,bitcount),我们得到红色数...

啊,等等!这些颜色可能不是"使用中".我们必须检查我们的32位int以查看是否正在使用给定的检查器!所以说我们已经为我们占用的32个整数设置了011 ...这意味着第一个检查器,上面的01(红色非国王)......实际上没有被占用...它只是一个空方块.如果我们要在那里移动另一个检查器,我们可能需要或不需要更新这两个王色位.所以把它们放在一起

32bit = 011
64bit = 011001

代表3个检查员职位......一个空的检查员之前是红色的,接着是黑色的国王,接着是红色.一旦我们在64位上执行010101掩码操作,我们得到:

64bitWithMask = 010001
32bit=011

天真的我们有2个红色...但我们实际上只有1个活动...我想要做的主要是采用64位字符串中的奇数位,并将它们与32位字符串中的每个位进行对比...即

1 AND 0, 0 AND 1, 1 AND 1 给我们001代表红色检查器的数量.

或者等效地,转换64bitWithMask64bitWithMaskOddBits = 101 Then然后简单地用32位得到011 & 101 = 001.

那么形式上,有没有办法取一个长度为2X的字符串,并通过只取奇数位将其减少到长度X?我正在努力避免循环,ifs等,并且只使用逻辑(和,或,xor,否定等).

或者当然,如果有另一种策略可以根据我的32位和64位字符串获得正确的红色计数.谢谢!

编辑:

我提出的问题的解决方案在接受的答案中优雅地解决了,但是对于我的实际应用来说更好的解决方案是将64位表示分成两个32.这节省了一大堆操作来提取我需要的东西.感谢LukeG和Tehtmi的帮助!我很高兴接触到这种新的位操作技术,"并行".



1> tehtmi..:

将每个其他位从一个数字压缩为半长数字有点棘手,因为每个位需要移位不同的数量.但是,有一种聪明的方法可以比单独处理每个位需要更少的操作.对于64位,它看起来像这样(伪代码):

x = x & 0x5555555555555555
// or for the alternate bits: x = (x >> 1) & 0x5555555555555555
x = (x | (x >>  1)) & 0x3333333333333333
x = (x | (x >>  2)) & 0x0f0f0f0f0f0f0f0f
x = (x | (x >>  4)) & 0x00ff00ff00ff00ff
x = (x | (x >>  8)) & 0x0000ffff0000ffff
x = (x | (x >> 16)) & 0x00000000ffffffff

下面是一个32位数字(在初始掩码之后)每一步的位数发生的说明:

0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p
00ab00cd00ef00gh00ij00kl00mn00op
0000abcd0000efgh0000ijkl0000mnop
00000000abcdefgh00000000ijklmnop
0000000000000000abcdefghijklmnop

例如,位g需要9向右移动,因此请查看两个幂的组件9 = 1 + 8.因此,g>> 1步骤和>> 8步骤中移动.

这种比特算法有时被描述为"并行".您可能有兴趣查看这个着名的列表.(它包括与这里发生的事情密切相关的交错.)

这类代码的标准免责声明通常很难使用,因此它可能不应该用于严肃的项目,除非实际存在性能问题(即使这样,也要确保它清楚代码是什么做,例如评论).如果没有性能问题并且您仍然希望使用位操作,那么循环解决方案可能仍然是首选,因为它更容易理解和使用.


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 显卡750ti价格(750ti显卡发行价格)
    |责编:林光楠在当前这个B2BB2C逐步取代传统卖场占据主导地位的时代,通过电商、淘宝平台直接购买电脑相信已经成了不少对DIY认识不太深入的主流用户首选的配机方案。相比线下购买,网 ... [详细]
author-avatar
feng2502863897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有