我寫了一些代碼作爲練習,本質上只對任何大小的數據片段執行數學運算(除了循環)按位操作。它主要的功能,但有一個問題,我不明白,我不能重新創建斷章取義,有一點的代碼與它一起去,但這裏是一個的給我的麻煩更改字符數組的一個成員改變另一個
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的位移也不適用於較大的數字,但我認爲這些失敗是出於與整個字節移位失敗相同的原因。
我不認爲我那樣做了? – rtpax
您沒有,但您確實打破了同一規則的雙下劃線部分。更多這裏:[有關在C++標識符中使用下劃線的規則是什麼?](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac -identifier) – user4581301
謝謝你指出。只是爲了驗證,這可能不會影響這個嗎? – rtpax