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

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

问题描述:

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

+1

所以你想让我们为你解决功课吗?你试过什么了?什么没有用?为什么它不工作? – Darhuuk 2011-04-05 11:35:02

+2

@darhuuk在将任何问题标记为家庭作业之前都会三思。这是一个讨论论坛,而不是您的人员博客..了解它 – 2011-04-05 11:38:15

+0

哦,我的天哪 - 这些没有脑子的家庭作业在哪里? – Ingo 2011-04-05 11:41:03

那么,让我们试试。我假设数组从index = 0开始,我们知道它的大小。如果不是,则更改下面代码中的while循环来倒计时,并稍微摆动逻辑。

真正的问题不在于如何删除以前的元素。它计算出给定的索引i是否是字符的开始(是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 
} 

很显然,我还没有实现,并检查这一点,但它似乎是所有选项都包括在内。随时纠正我或戳我,如果你想要一个书面解释为什么这应该工作。

+0

你有什么关于Don'care condition.i认为它可以是o或1.如果是这样的话,那么你的第一个案件不能保证是真实的.. – 2011-04-05 13:06:56

+0

@prp第一种情况:MSB_i == 0,所以无论是1字节字符还是2字节字符的开始。为了检查,我们检查下一个字节的MSB。如果它是0,那么我指向的那个必须是一个1字节的字符。如果它是1,这意味着我指向的字节必须是2字节字符的开始。因此,我的第一个案例照顾不关心。 – Darhuuk 2011-04-05 13:48:58

对于任何元素array[i],你可以决定是否i指向单字节字符,2字节字符的开始,或2字节字符的使用下面的测试中:

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

如果array[i]前面有1的奇数,那么array[i]是2字节数组的中间。

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

因为我们正在努力只是array[i]之前删除字符,一旦你确定array[i]为起点或字符的中间,那么你必须运行相同的测试array[i-x],其中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,如果有0或偶数个连续的1的。


如果我们有与ARR [0] 1字节的字符和在ARR 2字节的字符数组[1],然后,据说,我只能具有值0,1,或2.

  • i = 0:循环从不运行,因为我== 0。我们认为,因为奇数== 0,所以前面的1的数字是EVEN。 arr [i]的MSB是0,所以arr [i]是1字节字符的开始。
  • i = 1:因为MSB(arr [i-1])为0,所以循环从不运行。我们认为存在EVEN连续1的数目,因为奇数== 0。 arr [i]的MSB是1,因此arr [i]是一个2字节字符的开头。
  • i = 2:循环运行一次。我们发现一个ODD连续1的数字。因为前面的1有一个奇数,所以arr [i]是2字节字符的中间值。
+0

如果我们有一个数组,然后如何排列,那么我的算法如何工作arr [0] = 1 byte arr [1] = 2 byte – 2011-04-05 13:08:44

+0

@prp:我之前的描述不会测试i == 0或接近0。你倒计时了,你需要解释这一点。我将编辑我的答案,为您的示例提供解释... – oosterwal 2011-04-05 13:22:05

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

首先,什么是“2字节字符的中间”?这可能是第一个人物的最后三分之一和第二个人物的前三分之一?不,它的废话。一个2字节的字符有第一个和第二个字节,但没有“中间”。

其次,由于没有规定存储最重要和最不重要的字节的顺序,因此练习有点不确定。

但让我们假设,LSByte存储在较低的地址,那么任务很简单。只要检查byte [i-1]的最高有效位,如果它被设置,则前一个字符是双字节字符,否则是单字节。 (我们知道我说的是一个角色,而不仅仅是一个字节。)

+0

确定无论您考虑的是正确的问题,但您的解决方案不正确..假设我们有arr [i] = 0和arr [i-1] = 1的MSB,那么如果你想删除前一个字符,那么你必须移动i-2,因为arr [i-1] = 1是当前字符并且你必须删除前一个字符..你希望你明白... – 2011-04-05 13:48:38

+0

不,在这两种情况下,arr [i]的MS位是不相关的。在我的字符是单字节或我指向低字节(如果字节顺序是低字节,高字节) – Ingo 2011-04-05 13:58:13