给定一个字节数组,其中字符可以是1个字节或2个字节长 对于1字节字符,最高有效位必须为0.对于2- 字节字符,最重要字节的最高位 必须是最低有效字节的一个和最重要的位 是不关心(X)。你得到了索引,我是一个角色的 字节数组。请注意,I-1或I + 1可以引导您进入角色或 一个角色的中间。给出一个逻辑(不需要代码)来删除 我指出的那个字符的前一个字符。
答案 0 :(得分:0)
真正的问题不是如何删除前一个元素。它计算出给定的索引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的值。
答案 2 :(得分:0)
在我看来,你们都有点困惑吗?
首先,什么是“2字节字符的中间”?它可能是第一个角色的最后1/3和第二个角色的前1/3吗?不,这是胡说八道。 2字节字符有第一个和第二个字节,但没有“中间”。
其次,因为没有按照什么顺序指定存储最重要和最不重要的字节,所以练习有点不明确。
但是让我们假设,LSByte存储在较低的地址,然后任务很容易。只需检查byte [i-1]的最高位,如果已设置,则前一个字符是双字节字符,否则它是单字节。 (我们知道我会处理一个字符,而不只是一个字节。)