2 language-agnostic bit-manipulation
我正在尝试在程序集中编写一个函数,它将检测更长的二进制数是否包含更小的二进制模式.
示例:100111
是否包含1001?
当我读到这个问题时,我想我会用一个大数字及其较小的模式进行按位-AND,同时每次在循环中右移(逻辑).
所以,在我的脑海里,我认为它会做:
100111 AND 1001 = 0
Shift-right 1
010011 AND 1001 = 0
Shift-right 1
001001 AND 1001 = 1 // Pattern FOUND!
Run Code Online (Sandbox Code Playgroud)
并重复此操作,直到数字被移动直到它为零或AND返回1.
但是,我想我必须有一些困惑,因为在第一次循环运行时,我输入的大部分内容都会返回1.我对AND的使用感到困惑吗?
问题是"部分匹配"也会为您的AND检查返回一个非零值:
100111 AND 001001 = 000001
Run Code Online (Sandbox Code Playgroud)
因此,如果任何位匹配,则测试,但是您要确保所有位都相同.AND的结果需要等于您搜索的模式:
x = 100111
if (x AND 1001 == 1001)
print "found"
Run Code Online (Sandbox Code Playgroud)