簡體   English   中英

使用uint64_t進行移位無法正常工作

[英]Shifting with uint64_t not working as expected

作為較大任務的一部分,我被要求實現一個函數,該函數可以將整數中的任意位翻轉。 問題是,“整數”可以是c中從int8_t到uint64_t的任何默認整數類型,而我不知道它將是哪一個。 (實際上,我的代碼已經在所有這些類型上進行了測試)

這是我嘗試解決的問題:

//NOTE: g_int is the generic integer, it's typedef'd in a .h file
g_int flip_bit(g_int b, uint8_t i){
    //Code that makes sure i is a valid amount to shift by, there's a macro
    //that defines the upper bound of i in a .h file.
    g_int flipped = b ^ (1<<i);
    return flipped;
}

此代碼異或的i個比特b與1,而在其它位b 0。這應當翻轉i個比特而留下其余部分保持不變。 對此感到滿意,我在所有這些不同的整數大小上測試了我的代碼,然后將其上交。但是,我必須做的測試不夠多,因為我的代碼在int64_t和uint64_t上均失敗。

我對int64_t和uint64_t做錯了什么,我可以做些什么使我的方法正常工作而無需完全更改它?

此問題是由1的類型引起的,該類型為int(在合理的計算機上為32位)。 這意味着對於大於或等於32的i值執行移位(1<<i)將導致不確定的行為。

只需在執行移位之前將1強制轉換為g_int類型g_int此問題:

g_int flip_bit(g_int b, uint8_t i){
    g_int flipped = b ^ (((g_int)1)<<i);
    return flipped;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM