2015-06-11 391 views
4

我試圖處理位板,這需要我在64位無符號整數中設置一個特定的位。要設置位,我執行一個按位或與有問題的位板,左移數字。C++中的64位整數的按位(Bitshift)操作

​​

它工作正常,從0位到第31位,但未能對位工作32到63我懷疑這是因爲右側的評價恰好是在32位整數。因此,我嘗試了一個臨時變量。

uint64_t temp = 0ULL; 
temp |= 1 << i; 

也許它仍然評估作爲一個32位整數的右側,或者這是我無法弄清楚的其他問題。要輸出整數,我使用std :: bitset < 64>。例如:

uint64_t kings = 0ULL; 
kings |= 1 << 3; 
kings |= 1 << 59; 

預期十進制值:576460752303423496

實際:8

std::bitset<64> x(kings); 
std::cout << x; 

位值:0000000000000000000000000000000000000000000000000000000000001000

顯然,只有國王| = 1 < < 3;正確工作。

總之,第32到63位是什麼問題,我該如何解決它?

+2

你嘗試 '王| =(uint64_t中)1 <<(uint64_t中)I;'或'國王| = 1ULL <<我;'? –

+0

@DannyRuijters沒有想到它。我試圖將它等同於臨時uint64_t。關! –

回答

7

你需要你用shift operator <<得到64位的結果之前,使用1LL 64位值:

#include <stdint.h> 
uint64_t kings = 0ULL; 
kings |= 1ULL << i; 
3

你需要位位移64位整數:

kings |= 1i64 << 59; 
3

什麼是位32到63的問題?

字面1的類型爲int。移位運算符的結果類型是其LHS的類型(在對其執行常規算術轉換之後)。它在你的實現上似乎是32位,所以將它移位31位以上會產生未定義的行爲。

使用一個64位的整數作爲移位操作者的左操作數:

temp |= static_cast<uint64_t>(1) << i;