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

Algorithm 删除字节数组中的前一个字符,algorithm,Algorithm,给定一个字节数组,其中的字符可以是1字节或2字节长 对于1字节字符,最高有效位必须为0。对于2- 字节字符,最高有效字节的最高有效位 必须是最低有效字节的最高有效位 就是不在乎(X)。您将获得 字节数组。请注意,I-1或I+1可以引导您找到角色或 人物的中间部分。给出要删除的逻辑(不需要代码) 我指向的字符的前一个字符 那么,让我们试试看。我假设数组从index=0开始,我们知道它的大小。如果没有,请更改下面代码中的while循环,以倒计时并稍微抖动逻辑 真正的问题不是如何删除前面的元素。它要计

给定一个字节数组,其中的字符可以是1字节或2字节长 对于1字节字符,最高有效位必须为0。对于2- 字节字符,最高有效字节的最高有效位 必须是最低有效字节的最高有效位 就是不在乎(X)。您将获得 字节数组。请注意,I-1或I+1可以引导您找到角色或 人物的中间部分。给出要删除的逻辑(不需要代码)
我指向的字符的前一个字符

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

真正的问题不是如何删除前面的元素。它要计算出给定的索引i是字符的开头(无论是1字节还是2字节)还是2字节的中间。一旦我们知道了这一点,删除前一个元素就很简单了,因为确定前一个元素是1字节还是2字节是很简单的

所以,我相信这应该可以用来计算出I是什么指数。伪代码:

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
}

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

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

真正的问题不是如何删除前面的元素。它要计算出给定的索引i是字符的开头(无论是1字节还是2字节)还是2字节的中间。一旦我们知道了这一点,删除前一个元素就很简单了,因为确定前一个元素是1字节还是2字节是很简单的

所以,我相信这应该可以用来计算出I是什么指数。伪代码:

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
}

显然,我还没有实现并检查这一点,但似乎涵盖了所有选项。如果您想书面解释为什么这样做,请随时纠正我或戳我。

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

数组[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

奇数^=1对于任何元素
数组[i]
,您可以使用以下测试确定
i
是否指向单字节字符、2字节字符的开头或2字节字符的中间:

数组[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

奇怪的^=1在我看来你们都有点困惑

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

其次,由于没有指定最高有效字节和最低有效字节的存储顺序,因此该练习的指定有点不够


但是让我们假设,LSByte存储在较低的地址,那么任务就很容易了。只需检查字节[i-1]的最高有效位,如果已设置,则前一个字符为双字节字符,否则为单字节字符。(我们知道我的地址是一个字符,而不仅仅是一个字节。)

看起来你们都有点困惑了吗

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

其次,因为没有指定最高有效字节和最低有效字节的存储顺序,所以这个练习有点复杂