2011-04-05 43 views
2

給定一個字節數組,其中字符可以是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

回答

0

那麼,讓我們試試。我假設數組從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

0

對於任何元素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

0

在我看來,你們都有點困惑?

首先,什麼是「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

相關問題