【问题标题】:Is there any other way to calculate bitwise logical operations?有没有其他方法来计算按位逻辑运算?
【发布时间】:2020-12-01 02:54:03
【问题描述】:

我正在研究按位逻辑运算(AND、OR 等)。例如。

15 AND 24 可以如下计算。

  1. 将给定的数字转换为二进制形式。

01111 和 11000

  1. 对两个数字的每个位执行按位与运算。

= 01000

  1. 将二进制转换为十进制。

8

我想知道,

  1. 有没有直接的方法(不转换成二进制形式)来得到这个操作的结果?如果不是,请告诉我们获得结果的最佳方法是什么。我需要对 170141183460469231731687303715884105728 或以上的非常大的数字执行此操作。

  2. 我正在尝试在 C 中实现它,我无法在 C 中存储大于 18446744073709551615 的整数,所以我想知道如何实现对大数的运算,因为我们不能直接存储这些数字。

是否有任何算法可以获取这些数字的块并执行这些操作。例如

0170 1411 8346 0469 2317 3168 7303 7158 8410 5728
&
1321 3221 3654 5646 5646 6546 6489 9873 9765 9721
-------------------------------------------------
result = very large number

我可以使用任何在线资源来对此进行更多了解吗?

【问题讨论】:

  • 不,没有更直接的方法。最有效的方法是特定于语言的,但大多数语言都提供了最有效的方法来实现位运算符。
  • 许多当前语言在整数上实现ANDa & b。垂直条通常用于 OR: a | b 。请注意,您的最大值是 127 位长,因此您可能需要一个特殊的超长整数数据类型。 Python等语言支持无限大小的整数,所以你可以直接对这些整数调用a & b
  • @JohanC 好吧,你当然可以隐藏在语言结构后面,但内部逻辑仍然是基于二进制的
  • 请记住,您应该让计算机以二进制形式存储其值,以便计算机可以直接处理这些值。只有在与人类交互时才需要与十进制进行转换。不要将值存储为十进制,然后在按位逻辑运算之前将十进制转换为二进制,然后再转换回十进制进行存储。我见过有人这样做,看到这种低效率是痛苦的。

标签: c bitwise-operators logical-operators bigint integer-arithmetic


【解决方案1】:

没有直接的方法可以得到结果 - 你必须转换成二进制。

幸运的是,计算机可以很好地将十进制数字转换为二进制。他们一直使用二进制:一旦你把一个数字输入计算机,它做的第一件事就是将它转换成二进制。同样,打印结果时,二进制数会自动转换为十进制数。

以下是在 Python 中计算按位逻辑与的方法,例如:

print(15 & 24)
# prints: 8

看看您自己如何无需执行任何操作即可将数字转换为二进制,或将结果转换为十进制?编程语言及其库为您完成了这一切。

它也适用于非常大的数字:

print(123456789012345678901234567890 & 987654321987654321987654321)
# prints: 657693129655407100634333840

更新: C 语言没有任意的大整数类型。可用的数据类型因目标平台和编译器而异:如果您以 64 位 CPU 为目标,则最多可以使用 128 位整数,最多可以覆盖 170141183460469231731687303715884105728。请参阅Is there a 128 bit integer in gcc?

如果您想超越这一点(或者您的目标是其他架构),您将需要一个实现“任意精度算术”的库。有several options available。 GNU GMP 是最著名的之一。 OpenSSL 等加密库还附带了对任意大整数进行计算的函数。

使用 GMP,您可以使用 mpz_and 函数对两个数字进行“按位与”运算。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多