当我发现河内塔楼的这种不同寻常的迭代解决方案时,我迷失在互联网上:
for (int x = 1; x < (1 << nDisks); x++)
{
FromPole = (x & x-1) % 3;
ToPole = ((x | x-1) + 1) % 3;
moveDisk(FromPole, ToPole);
}
Run Code Online (Sandbox Code Playgroud)
这篇文章在其中一个答案中也有类似的Delphi代码.
然而,对于我的生活,我似乎无法找到一个很好的解释为什么这个工作.
任何人都可以帮我理解吗?
language-agnostic algorithm bit-manipulation towers-of-hanoi
使用Shift运算符而不是使用除法和乘法的目的是什么?
使用移位运营商还有其他好处吗?
应该在哪里尝试使用移位运算符?
我是bitwise运算符的新手.
我理解逻辑函数如何工作以获得最终结果.例如,当你按位AND两个数字,最后的结果将是在AND这两个数值(1 & 0 = 0; 1 & 1 = 1; 0 & 0 = 0).与OR,相同XOR,和NOT.
我不明白的是他们的应用.我试着到处寻找,其中大多数只是解释按位操作是如何工作的.在所有按位运算符中,我只理解移位运算符的应用(乘法和除法).我也遇到了掩蔽.我知道屏蔽是按位进行的,AND但究竟是什么目的以及我在何处以及如何使用它?
你能详细说明我如何使用遮蔽吗?对于有类似用途OR和XOR?
众所周知,乘法,整数除法和2的幂的模可以作为按位运算更有效地重写:
>>> x = randint(50000, 100000)
>>> x << 2 == x * 4
True
>>> x >> 2 == x // 4
True
>>> x & 3 == x % 4
True
Run Code Online (Sandbox Code Playgroud)
在诸如C/C++和Java等编译语言中,测试表明按位运算通常比算术运算更快.(见这里和这里).但是,当我在Python中测试这些时,我得到了相反的结果:
In [1]: from random import randint
...: nums = [randint(0, 1000000) for _ in range(100000)]
In [2]: %timeit [i * 8 for i in nums]
7.73 ms ± 397 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) …Run Code Online (Sandbox Code Playgroud) 我不断地遇到使用按位运算符的人来做快速,简单和优雅的事情.我想学习一些有用的技巧.什么是一些最有用的按位运算符案例?
维基百科,一个真正的知识来源,指出:
在大多数较旧的微处理器上,按位运算比加法和减法运算稍快,并且通常比乘法和除法运算快得多.在现代体系结构中,情况并非如此:按位运算通常与添加速度相同(尽管仍然比乘法更快).
是否有一个实际的理由来学习按位操作黑客,或者现在只是你学习理论和好奇心的东西?
所以我目前正在通过《SAMS 每天 1 小时自学 C++》一书学习 C++。到目前为止,一切都很棒——我已经理解了所说的一切,并且我已经成功地在简单的程序中使用它们来练习它们。
然而,我刚刚读到有关按位运算符的部分,我完全被难住了。我知道你有 &、~、|、<<、>> 等,并且我知道每个数字对二进制形式的数字执行不同的操作,因为 ~ 翻转数字。
我遇到的问题是我无法理解你想要如何以及为什么使用它们。我可以采用一个 int,将二进制数字翻转并得到另一个数字,但这对我的形状或形式到底有什么帮助呢?我希望能解释一下为什么你会使用每一个,如果可能的话,也许可以举个例子?
感谢大家!
Win32应用程序如何只响应第一个WM_KEYDOWN通知?MSDN文档声明位30"指定先前的密钥状态.如果密钥在发送消息之前关闭,则值为1,如果密钥已启动则为零." 但在我的WndProc中,第30位始终为0.
case WM_KEYDOWN:
// ToDo - stop multiple notifications for repeating keys
printf("WM_KEYDOWN %i %i", wParam, lParam & 30);
return 0;
Run Code Online (Sandbox Code Playgroud)
请问lParam&30是错误的方式吗?我做错了什么吗?
我试图解释与OR逻辑相比的XOR逻辑.
或者例子很多,例如"我需要在里面或使用雨伞保持干燥",但XOR示例更难.