2012-04-12 91 views
6

我有一個名爲replaceByte(x,n,c)函數是在xc有以下限制替換字節n替換字節數

  • 字節從0(LSB)到3號(MSB)
  • 實例:replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • 可以假定0 < = N < = 3和0 < = C < = 255個
  • 法律OPS :! ~ &^| + << >>
  • 最大OPS:10

    int replaceByte(int x, int n, int c) { 
         int shift = (c << (8 * n)); 
         int mask = 0xff << shift; 
         return (mask & x) | shift; 
        } 
    

,但是當我測試它,我得到這個錯誤:

ERROR:測試replaceByte(-2147483648 [0x80000000的],0爲0x0] 0 [0x0])失敗... ...給出0 [0x0]。意識到*是不是合法的經營者,我終於想通了...之後應該是-2147483648 [0x80000000的]

,如果你很好奇,這是我做的:

int replaceByte(int x, int n, int c) { 
    int mask = 0xff << (n << 3); 
    int shift = (c << (n << 3)); 
    return (~mask & x) | shift; 
} 

回答

4

啊......你快到了。

只要改變

return (mask & x) | shift; 

return (~mask & x) | shift; 

mask應該包含除了區域被掩蓋,而不是相反所有的人。

我用這簡單的代碼,它工作在GCC精細

#include<stdio.h> 

int replaceByte(int x, int n, int c) 
{ 
    int shift = (c << (8 * n)); 
    int mask = 0xff << shift; 
    return (~mask & x) | shift; 
} 

int main() 
{ 

    printf("%X",replaceByte(0x80000000,0,0)); 

    return 0; 
} 
+2

嗯即使是這樣,我得到的是同樣的錯誤 – asdfghjkl 2012-04-13 03:24:03

+0

@shaynie看我的編輯 – 2012-04-13 03:42:19

+0

你能解釋一下 - >「int mask = 0xff << shift;」是否適合你。我可能應該更新OP是「int mask = 0xff <<(n << 3);」 – 2016-02-19 02:42:55

6

由於這看起來像功課我不打算髮布代碼,但列出你需要執行的步驟:

  1. 演員c成一個32位的號碼,這樣你不會失去任何位在換擋
  2. 接下來,由c轉移(如果n==0沒有移位,如果n==1移位8等)
  3. 創建一個32位的位掩碼,它將清零x的最低8位,然後將該掩碼移位等於最後一步
  4. 執行按位與移位位掩碼和x的置零的x
  5. 中的相應位進行移位c值的逐位OR(或添加),並x取代的後者
的掩碼位
+0

好,我明白了這一切,除了在這裏你說:「創建一個32位掩碼,將零的低8位部分X...「 – asdfghjkl 2012-04-12 22:55:03

+0

@shaynie在你開始替換'x'的位之前,你需要清零將要被替換的8位,這就是位掩碼的來源。 – Praetorian 2012-04-12 22:59:33

+0

好吧,我把一些代碼放在上面已經提交併且我收到的錯誤 – asdfghjkl 2012-04-13 02:40:46