【问题标题】:Find longest alternating string of 1's and 0's查找最长的 1 和 0 交替字符串
【发布时间】:2016-11-13 06:50:23
【问题描述】:

我正在学习汇编中的按位运算。就按位运算而言,找到最长的 0 或 1 字符串是相当先进的,但如何找到最长的交替 1 和 0 字符串。

我认为这与前两个类似,因为您只需要进行右移并执行适当的操作,然后重复直到全为 0,但我无法弄清楚解决方案。有什么想法吗?

谢谢!

编辑

一些例子: 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 

【问题讨论】:

  • 我们可以看看你的尝试 Jade 吗?
  • “找到”最长的这样的字符串是什么意思?你能举一些输入和输出的例子吗?
  • 您说“在组装中”,但没有提及哪种架构 - 如果没有这些信息,您将无法获得有意义的答案
  • 我按照建议进行了编辑

标签: algorithm bit-manipulation bitwise-operators


【解决方案1】:

这是获得最长交替位模式的逻辑:

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

【讨论】:

    【解决方案2】:

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

    假设交替模式必须以 1 开头,如果它是 1 后跟 0,或者 0 前跟 1,则需要设置一个位,如下所示:

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      相关资源
      最近更新 更多