找到最长的交替字符串1和0' s

时间:2016-11-13 06:50:24

标签: algorithm bit-manipulation bitwise-operators

我在汇编中学习按位操作。在按位运算方面,找到最长的0或1或1的字符串是非常正向的,但是如何找到交替的1&0和0的最长字符串。

我认为这与前两个类似,你只需要做一个正确的转换并做适当的操作,然后重复直到你有所有的0,但我无法&# 39;找出解决方案。关于该怎么做的任何想法?

谢谢!

修改

一些例子: 101101010001具有6个交替的1和0的字符串。数字1010有一个字符串 连续4个1和0。 我不太关心0和1的交替字符串,所以0101只有2,因为它中间有10个

我使用的架构是ARM A9处理器

这是我试过的

.text
.global _start
_start:

MOV R5, #0//Store final result
MOV R6, #0
MOV R2 , #0
MOV R7, #0
LDR R3 , =TEST_NUM

ONES: LDR R1, [R3]  //Load the data word into R1 
    MOV R0, #0      // R0 will hold the result
LOOP: CMP R1, #0     //loop until data contains no more ones
    BEQ NEXT
    LSR R2, R1, #1  //Perform shift, followed by and
    XOR R1, R1, R2
    ADD R0, #1      // count number of iterations
    B LOOP
NEXT: CMP R5, R0 //
    MOVLE  R5, R0
    B END
END:   B END

TEST_NUM: .word 0x1fffffff, 0x7fffffff
.end 

2 个答案:

答案 0 :(得分:0)

这是您可以用来获得最长交替位模式的逻辑:

int last_bit = num & 1;
int count = 1;
int bit_at_pos;    //holds LSB
num = num >> 1;
int longest = 1;

while(num > 0){
    bit_at_pos = num & 1;
    if(bit_at_pos == 1 - last_bit){  //Checks if this bit is alternate to last bit or not.
        count++;    
    }else{
        if(longest < count) longest = count;
        count = 1;
    }
    last_bit = bit_at_pos;
    num = num >> 1;
}
// longest is the answer

答案 1 :(得分:0)

如果您已经有一个计算连续1的数量的算法,那么您可以转换输入,使作为交替模式一部分的每个位设置为1,然后将其输入到1s计数算法

假设交替模式必须以1开头,你想要设置一个位,如果它是一个后跟一个0的0,或一个前面带一个1的0,如下所示:

x = (x & ~(x << 1)) | (~x & (x >> 1))

然后计算x中连续1的数量。