2016-08-04 64 views
0

我寫了一些代碼作爲練習,本質上只對任何大小的數據片段執行數學運算(除了循環)按位操作。它主要的功能,但有一個問題,我不明白,我不能重新創建斷章取義,有一點的代碼與它一起去,但這裏是一個的給我的麻煩更改字符數組的一個成員改變另一個

const __rint<size> _leftshiftto(__rint<size>arg) 
{ 
    if (arg.val[0] & 0x80)//negative arg 
    { 
     return _rightshiftto(arg._negto()); 
    } 
    uint32_t byte = (arg._int32()/8); 
    uint32_t carbyte = size - byte; 
    byte = byte; 
    uint8_t bit = (arg._int8() % 8); 
    uint8_t carbit = 8 - bit; 


    for (uint32_t n = 0; n<carbyte; ++n) 
    { 
     puts("iter"); 
     printf("%02hhx <- %02hhx\n",val[n],val[n+byte]); 
     val[n] = val[n + byte]; 
    } 
    for (uint32_t n = carbyte; n < size; ++n) 
    { 
     puts("iter2"); 
     val[n] = 0x00; 
    } 

    for (uint32_t n = 0; n<size-1; ++n) 
    { 
     val[n] <<= bit; 
     val[n] &= val[n + 1] >> carbit; 
    } 
    val[size - 1] <<= bit; 

    return *this; 
} 

片斷完整的代碼是https://github.com/rtpax/rmath/blob/master/rint.h

發生什麼事情是,它適用於足夠小的值,但對於輸入8或更高值(如果它移動了整個字節,則評估爲零)。

__rint<4> a(5); 
//evaluates to 0x00000005 
a._leftshiftto(4); 
//evaluates to 0x00000050 
__rint<4> b(5); 
//evaluates to 0x00000005 
b._leftshiftto(8); 
//evaluates to 0x00000000 

有什麼奇怪的是,如果你改變了行

val[n] = 0x00; 

val[n] = 0xff;//or anything 0x80 and above 

它確實只是最右邊的字節將與任何號碼,你放在那裏(所以填寫工作從上面的b將評估爲0x000005ff) 如果有人可以提供解釋我很感激,我對此感到不知所措。

一些其他注意事項:

我用G ++編譯在Windows 10

看起來好象相關的是,當我打印出來我的不吉利的東西,他們顯示爲4位數字,而不是兩個,如果他們至少0x80(這將打印爲0xff80)

從1到7的位移也不適用於較大的數字,但我認爲這些失敗是出於與整個字節移位失敗相同的原因。

+0

我不認爲我那樣做了? – rtpax

+0

您沒有,但您確實打破了同一規則的雙下劃線部分。更多這裏:[有關在C++標識符中使用下劃線的規則是什麼?](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac -identifier) – user4581301

+0

謝謝你指出。只是爲了驗證,這可能不會影響這個嗎? – rtpax

回答

0

&是邏輯和操作員:它要求在兩個源1在目的地以產生1。產量0001

val[n] &= val[n + 1] >> carbit; 

這將設置val[n]爲零,因爲我們知道val[n]低位爲零,而我們卻將val[n + 1]位,因此相應的高位將爲零:

11111000 & 
00000111 = 
00000000 

你想要的|操作:

11011000 | 
00000010 = 
11011010 

另外請注意,您的代碼修改了這個對象,但你換貨政...按價值,製作副本。

你的返回類型大概應該是

const __rint<size>& 

回到依常量讓人很沒有意義在這裏。

+0

好眼睛,愚蠢的錯誤在我的部分。謝謝 – rtpax

相關問題