删除字节数组中的前一个字符

时间:2011-04-05 11:33:29

标签: algorithm

给定一个字节数组,其中字符可以是1个字节或2个字节长 对于1字节字符,最高有效位必须为0.对于2- 字节字符,最重要字节的最高位 必须是最低有效字节的一个和最重要的位 是不关心(X)。你得到了索引,我是一个角色的 字节数组。请注意,I-1或I + 1可以引导您进入角色或 一个角色的中间。给出一个逻辑(不需要代码)来删除 我指出的那个字符的前一个字符。

3 个答案:

答案 0 :(得分:0)

那么,我们试试吧。我假设数组从index = 0开始,我们知道它的大小。如果没有,请在下面的代码中更改while循环以倒计时并略微抖动逻辑。

真正的问题不是如何删除前一个元素。它计算出给定的索引i是否是char的开头(是1或2字节)还是2字节的中间。一旦我们知道这一点,删除前一个元素是微不足道的,因为弄清楚前一个元素是1还是2字节是微不足道的。

所以,我相信这应该可以找出我的指数。伪代码:

if MSB_i == 0
{
  if MSB_(i+1) == 1
    -> Start of 2-byte char
  else
    -> Start of 1-byte char
} else
{
  if MSB_(i+1) == 0
    -> Middle of 2-byte char
  else
  {
    j = i + 1
    while (MSB_j == 1) AND (j != size)
      j++

    j = j - i
    if j modulo 2 == 1
      -> Start of 2-byte char
    else
      -> Middle of 2-byte char
}

显然,我没有实现并检查这一点,但似乎涵盖了所有选项。如果你想要一个关于为什么这应该有效的书面解释,请随意纠正我或戳我。

答案 1 :(得分:0)

对于任何元素array[i],您可以使用以下测试确定i是指向单字节字符,2字节字符的开头还是2字节字符的中间位置:

array[i-1]开始计算连续MSB的数量== 1。

如果array[i]前面有一个1的ODD编号,则array[i]是2字节数组的中间位置。

如果array[i]前面的偶数为1,那么如果MSB(array[i])为0,array[i]是单字节字符,否则array[i]是一个字母的开头2字节字符。

由于我们尝试删除array[i]之前的字符,一旦确定array[i]是字符的开头还是中间,那么您必须为{{array[i-x]运行相同的测试1}},其中x为1或2,具体取决于array[i]是否分别指向字符的开头或中间。


编辑(当arr [0]为1字节,arr [1]为2字节时会发生什么?):

首先,关于搜索连续1的更多细节:当计算连续的1时,如果我们到达数组[0]或MSB(数组[j])== 0,则循环停止。

odd=0
j = i
while( j && MSB(arr[j-1]) )
    j-=1
    odd^=1       <<(binary XOR)

当循环完成时,如果存在奇数个连续的1,则奇数将为1,如果存在0或偶数个连续的1,则奇数将为0。


如果我们在arr [0]中有一个1字节字符的数组,在arr [1]中有一个2字节字符,那么,据说,我只能有0,1或2的值。

  • i = 0:循环永远不会运行,因为i == 0。我们认为前面有一个偶数的数字,因为奇数== 0。 arr [i]的MSB为0,因此 arr [i]是1字节字符的开头
  • i = 1:循环永远不会运行,因为MSB(arr [i-1])为0.我们认为有一个连续1的偶数数,因为奇数== 0。 arr [i]的MSB为1,因此 arr [i]是2字节字符的开头
  • i = 2:循环运行一次。我们找到连续1的 ODD 数。因为前面的1是奇数, arr [i]是2字节字符的中间

答案 2 :(得分:0)

在我看来,你们都有点困惑吗?

首先,什么是“2字节字符的中间”?它可能是第一个角色的最后1/3和第二个角色的前1/3吗?不,这是胡说八道。 2字节字符有第一个和第二个字节,但没有“中间”。

其次,因为没有按照什么顺序指定存储最重要和最不重要的字节,所以练习有点不明确。

但是让我们假设,LSByte存储在较低的地址,然后任务很容易。只需检查byte [i-1]的最高位,如果已设置,则前一个字符是双字节字符,否则它是单字节。 (我们知道我会处理一个字符,而不只是一个字节。)