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