问题描述
我正在研究按位逻辑运算(AND,OR等)。例如。
15和24的计算公式如下。
- 将给定数字转换为二进制形式。
01111和11000
- 对两个数字的每个位执行按位与运算。
= 01000
- 将二进制转换为十进制形式。
8
我想知道,
-
是否有直接方法(无需转换为二进制形式)来获取此操作的结果?如果没有,请告诉您获得结果的最佳方法是什么。我需要对数量最多为170141183460469231731687303715884105728或更大的数量执行此操作。
-
我正在尝试在C中实现它,我不能在C中存储大于18446744073709551551615的整数,因此我想知道如何实现大数运算,因为我们无法直接存储这些数字。
有没有采用这些数字的大块并执行这些操作的算法。例如
0170 1411 8346 0469 2317 3168 7303 7158 8410 5728
&
1321 3221 3654 5646 5646 6546 6489 9873 9765 9721
-------------------------------------------------
result = very large number
我可以使用任何在线资源来获得更多了解吗?
解决方法
没有直接获得结果的方法-您必须转换为二进制。
幸运的是,计算机相当不错,可以将十进制数字转换为二进制。他们一直使用二进制:将数字放入计算机后,它所做的第一件事就是将其转换为二进制。同样,当您打印结果时,二进制数字会自动转换为十进制。
例如,这里是如何在Python中计算按位逻辑AND的方法:
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
函数对两个数字进行“按位和”运算。