一塊的C++代碼,我正在讀的數學公式等同於位運算
int x = 10;
int r = 5;
auto bb = x << (r & 0x1);
其中BB讀取20.我瞭解操作如何按位的作品,但我很難解釋它的數學邏輯,比方說,使用上面解釋了傳統的數學方程。例如,< <意味着轉移。所以x < < n可能是x^n?那麼&是什麼意思?
一塊的C++代碼,我正在讀的數學公式等同於位運算
int x = 10;
int r = 5;
auto bb = x << (r & 0x1);
其中BB讀取20.我瞭解操作如何按位的作品,但我很難解釋它的數學邏輯,比方說,使用上面解釋了傳統的數學方程。例如,< <意味着轉移。所以x < < n可能是x^n?那麼&是什麼意思?
這個方程執行以下操作:
(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是奇數,解釋結果
r & 0x1
是r
和1
之間的按位與。這基本上等同於檢查r
是偶數還是奇數。
如果r
是偶數,則r
爲奇數或不執行任何操作(位移爲0)時,語句執行位移1
。左移整數n
等於將其乘以2^n
。所以在這種情況下,如果r
很奇怪,它會使x
加倍。
&是按位和運營商
r & 0x1
結果在1,如果該最後位被置位(即,如果r是奇數),並在0如果最後位未被置位(r爲偶數)。
左移n對應於乘以2^n。
爲R = 5是奇數1左移位perfomed,導致10 *(2^1)= 20
auto bb = x << (r & 0x1);
可以翻譯成英文爲:
如果r
是奇數,初始化bb
到x * 2
。
如果r
是偶數,則將bb
初始化爲x
。
r & 0x1
是1
如果r
是奇數和0
如果r
是偶數。
x << 1
等於x * 2
。
x << 0
等於x
。
非常簡單的答案!隨着jonas_toth的深入解釋,我現在瞭解按位操作! – Kyle
@凱爾,很高興我能夠幫助你更好地理解按位操作。 –
&被稱爲「按位和」。詳細計算:'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
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