我无法在Bitset方法中找到这个简单问题的正确解决方案。问题是从最左边的位开始找到位集的公共父节点。以下是一些例子:
011
010
001
Common Parent: 0
00
010
Common Parent: 0
00
11
10
Common Parent: None
1101
111
1100
Common Parent: 11
我的解决方案是和位集,然后通过查找这些位集的XOR上的第一个设置位来找到正确的长度。它适用于某些情况,但其他情况则失败。我有另一个想法,涉及循环使用Bitsets,如果你有解决方案,我将非常乐意避免。
[我知道它们可以表示为二叉树,但这涉及一个内存开销,我希望通过仅操作位集和一些布尔操作(AND,OR,NOR,NAND,XOR)来避免这种情况。
答案 0 :(得分:0)
你可以这样做:
obj-m := $(MODNAME).o
ccflags-y := $(CCFLAGS)
src_files := $(wildcard $(foreach pat,*.c *.cpp *.s,src/$(pat) src/$(MODNAME)/$(pat)))
$(MODNAME)-objs := $(addsuffix .o, $(basename $(src_files)))
all:
make -C $(KDIR) M=$(shell pwd) modules
clean:
make -C $(KDIR) M=$(shell pwd) clean
我在代码中写了几条评论。我希望它有所帮助!
答案 1 :(得分:0)
您可以AND
和OR
所有位集并存储在两个变量中。从MSB
到LSB
同时迭代这两个变量。如果OR[i]
为0
,则所有位集在i th 位置都有0
。如果AND[i]
为1
,则所有位集在该位置都有1
,否则它们会混合。
答案 2 :(得分:0)
我建议倒转数字并从右边找到父母,然后将父母翻转以找到真实的东西。
我认为你遇到的最棘手的情况是
1101
111
1100
Common Parent: 11
并且倒车会让你离开它。