当前位置: 首页 > 面试题库 >

2公式帮助的力量

唐珂
2023-03-14
问题内容

我知道Java中的(2 * i ==(i ^(i-1)+ 1)会让我发现数字是否为2的幂,但是有人可以解释为什么这样做有效吗?


问题答案:

2 * i ==(i ^(i-1))+ 1

基本上,如果i为2的幂,则1其位模式将为单个。如果从中减去1,则该位的所有低位将1变为1,并且该2的幂将变为0。然后XOR对这些位进行“
1”运算,从而产生全1的位模式。您将其加1,得到下一个2的幂。

记住异或表:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

例:

假设i是256,即位模式。

100000000 = 2^8 = 256

100000000 - 1 = 011111111 = 2^7 + 2^6 + ... + 2^0 = 255

100000000 ^ 011111111 = 111111111 = = 2^8 + 2^7 + ... + 2^0 = 511

111111111 + 1 = 1000000000 = 2^9 = 512 = 2*i

这是一个例子,当您没有看到2的幂时

i = 100 = 2^6 + 2^5 + 2^2

0110 0100

0110 0100 - 1 = 99 = 2^6 + 2^5 + 2^1 + 2^0 = 0110 0011

0110 0100 ^ 0110 0011 = 0000 0111 = 2^2 + 2^1 + 2^0 = 7

0000 0111 + 1 = 000 1000 = 2^3 = 8 != (2*i)

简化版

此外,此检查还有一个修改版本,可以确定某个正无符号整数是否为2的幂。

(i & (i-1)) == 0

基本上,相同的理由

如果i为2的幂,则1它的位表示中只有一个位。如果从中减去1,则该1位将变为0,而所有低位将变为1。然后AND将产生一个全0位模式。



 类似资料:
  • 2. 获取帮助 使用Spring Boot遇到问题时: 试一下How-to’s —— 为最常见的问题提供了解决方案 了解Spring的基础知识 —— Spring Boot建立在许多其他的Spring项目之上,检查spring.io网站以获得丰富的参考文档。如果您刚刚开始使用Spring,可以试一下这些指南中的一个 提问 —— 我们监控着stackoverflow.com上标记为spring-bo

  • 简单易用的多平台文件同步软件,惊人的传输速度是不同于其他产品的最大优势, 微力同步 的智能 P2P 技术加速同步,会将文件分割成若干份仅 KB 的数据同步,而文件都会进行 AES 加密处理。

  • 对于本文档,如果你有问题或者建议,你该提交关于包 debian-installer-manual的 bug 报告。参见 reportbug包或者阅读Debian Bug Tracking System的在线文档。 良好的习惯做法是先检查 关于 debian-installer-manual 处于 open 状态的 bug了解是否你遇到 的问题已经被其他人报告。 如果有,你可以提供确认或者帮助信息到

  • 对于本文档,如果你有问题或者建议,你该提交关于包 debian-installer-manual的 bug 报告。参见 reportbug包或者阅读Debian Bug Tracking System的在线文档。 良好的习惯做法是先检查 关于 debian-installer-manual 处于 open 状态的 bug了解是否你遇到 的问题已经被其他人报告。 如果有,你可以提供确认或者帮助信息到

  • 对于本文档,如果你有问题或者建议,你该提交关于包 debian-installer-manual的 bug 报告。参见 reportbug包或者阅读Debian Bug Tracking System的在线文档。 良好的习惯做法是先检查 关于 debian-installer-manual 处于 open 状态的 bug了解是否你遇到 的问题已经被其他人报告。 如果有,你可以提供确认或者帮助信息到

  • 本文向大家介绍注意力公式相关面试题,主要包含被问及注意力公式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Soft attention、global attention、动态attention Hard attention “半软半硬”的attention (local attention) 静态attention 强制前向attention