2017-02-22 111 views
-1

一塊的C++代碼,我正在讀的數學公式等同於位運算

int x = 10; 
int r = 5; 

auto bb = x << (r & 0x1); 

其中BB讀取20.我瞭解操作如何按位的作品,但我很難解釋它的數學邏輯,比方說,使用上面解釋了傳統的數學方程。例如,< <意味着轉移。所以x < < n可能是x^n?那麼&是什麼意思?

+0

&被稱爲「按位和」。詳細計算:'x = 0b1010; r = 0b0101'。現在'r&0x1 = 0b0101&0b0001 = 1',然後'x << 1 = 0b1010 << 1 = 0b10100 = 1 * 16 + 0 * 8 + 1 * 4 + 0 * 2 + 0 * 1 = 20'。請參閱http://www.learncpp.com/cpp-tutorial/38-bitwise-operators/ – kritzikratzi

+0

ps。 'x << n'不是'x^n'。 (注意:在編程時,^ ^通常是一個xor,而不是數學能力)。無論如何,你可以使用shift來形成兩個正的冪,一般來說:'1 << x = pow(2,x)'。幾個例子:'1 << 0 = pow(2,0)= 1;''1 << 1 = pow(2,1)= 2;''1 << 2 = pow(2,2)= 4 ' – kritzikratzi

回答

3

這個方程執行以下操作:

(R &爲0x1)檢查r的奇數,例如:

r = 5 -> 00000101 in bits 
0x1 -> 00000001 in bits 

r & 0x1->00000001 since its only 1 if both bits are one. 

因此,如果r是奇數,則此術語的結果爲1,如果r是偶數,則此結果爲0。

現在我們左移此值(1或0)。

n << 0/1 

n = 10: 00001010 
n << 1 00010100 

所以此術語被加倍(左移)如果r是奇數,解釋結果

2

r & 0x1r1之間的按位與。這基本上等同於檢查r是偶數還是奇數。

如果r是偶數,則r爲奇數或不執行任何操作(位移爲0)時,語句執行位移1。左移整數n等於將其乘以2^n。所以在這種情況下,如果r很奇怪,它會使x加倍。

2

&是按位和運營商

r & 0x1結果在1,如果該最後位被置位(即,如果r是奇數),並在0如果最後位未被置位(r爲偶數)。

左移n對應於乘以2^n。

爲R = 5是奇數1左移位perfomed,導致10 *(2^1)= 20

2
auto bb = x << (r & 0x1); 

可以翻譯成英文爲:

如果r是奇數,初始化bbx * 2
如果r是偶數,則將bb初始化爲x

r & 0x11如果r是奇數和0如果r是偶數。

x << 1等於x * 2
x << 0等於x

+0

非常簡單的答案!隨着jonas_toth的深入解釋,我現在瞭解按位操作! – Kyle

+0

@凱爾,很高興我能夠幫助你更好地理解按位操作。 –