Для любого элемента array[i]
вы можете определить, указывает ли i
на один байтовый символ, начало 2-байтового символа или на середину 2-байтового символа, используя следующий тест:
Начиная с array[i-1]
считать количество непрерывных MSB == 1.
Если array[i]
предшествует число ODD, равное 1, то array[i]
является серединой 2-байтового массива.
Если array[i]
предшествует число ДАЖЕ, равное 1, то, если MSB(array[i])
равно 0, array[i]
- однобайтовый символ, в противном случае array[i]
- начало 2-байтового символа..
Поскольку мы пытаемся удалить символ непосредственно перед array[i]
, как только вы определите, является ли array[i]
началом или серединой символа, вы должны выполнить тот же тест для * 1020.*, где x
равно 1 или 2, в зависимости от того, указывает ли array[i]
на начало или середину символа, соответственно.
Редактировать (Что происходит, когда arr [0] равен 1-byte, а arr [1] является 2-байтовым?):
Во-первых, подробнее о поиске смежных 1:При подсчете смежных единиц цикл останавливается, если мы достигаем массива [0] или MSB (array [j]) == 0.
odd=0
j = i
while( j && MSB(arr[j-1]) )
j-=1
odd^=1 <<(binary XOR)
Когда цикл завершается, нечетным будет 1, если естьнечетное количество смежных 1 и нечетное будет 0, если есть 0 или четное число смежных 1.
Если у нас есть массив с 1-байтовым символом в arr [0] и 2-байтный символ в arr [1], тогда, предположительно, у меня могут быть только значения 0, 1 или 2.
- i = 0: цикл никогда не запускается, потому что i == 0.Мы считаем, что EVEN число предыдущих 1, потому что нечетное == 0.MSB для arr [i] равен 0, поэтому arr [i] является началом 1-байтового символа .
- i = 1: цикл никогда не выполняется, поскольку MSB (arr [i-1]) равно 0. Мы считаем, что EVEN число смежных 1, потому что нечетное == 0.MSB для arr [i] равен 1, поэтому arr [i] является началом 2-байтового символа .
- i = 2: цикл выполняется один раз.Мы находим ODD количество последовательных 1-х.Поскольку существует нечетное число предшествующих 1, arr [i] является серединой 2-байтового символа .