程序中的所有數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式儲(chǔ)存的,即只有0和1兩種數(shù)值,位運(yùn)算就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行。 1 <<(向左位移) 運(yùn)算規(guī)則:a<<b,表示a轉(zhuǎn)為二進(jìn)制后左移b位,左移后,空位補(bǔ)0。 例: 3: 00000000 00000000 00000000 00000011 // 左移2位,空位補(bǔ)2個(gè)0 3<<2: 00000000 00000000 00000000 00001100 所以,3<<2 = 12 規(guī)律:a左移b位,就是a乘以2的b次方。 2 >>(向右位移) 運(yùn)算規(guī)則:a>>b,表示a轉(zhuǎn)為二進(jìn)制后右移b位,右移后,最高位是0,則空缺位補(bǔ)0;最高位是1,則空缺位補(bǔ)1。 例: 4: 00000000 00000000 00000000 00000100 // 右移1位。右移后,最高位是0,則空缺位補(bǔ)0;最高位是1,則空缺位補(bǔ)1 4>>1 00000000 00000000 00000000 00000010 所以,4 >> 1 = 2 規(guī)律:a右移b位,就是a除以2的b次方。 3 &(與運(yùn)算) 運(yùn)算規(guī)則:相同位的兩個(gè)數(shù)字都為1,則為1;若有一個(gè)不為1,則為0。 例: 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5&6: 00000000 00000000 00000000 00000100 所以,5&6 = 4 4 |(或運(yùn)算) 運(yùn)算規(guī)則:相同位只要有一個(gè)為1即為1。 例: 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5|6: 00000000 00000000 00000000 00000111 所以,5|6 = 7 5 ^(異或運(yùn)算) 運(yùn)算規(guī)則:針對(duì)二進(jìn)制位,如果某位不同則該位為1, 否則該位為0。 例: 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5^6: 00000000 00000000 00000000 00000011 所以,5^6 = 3 6 ~(取反運(yùn)算) 運(yùn)算規(guī)則:對(duì)二進(jìn)制各位數(shù)進(jìn)行取反,即1變成0,0變成1。 例: 5: 00000000 00000000 00000000 00000101 ~5: 11111111 11111111 11111111 11111010 // 補(bǔ)碼形式 11111111 11111111 11111111 11111001 // 反碼 10000000 00000000 00000000 00000110 // 原碼 所以,~5 = -6 位運(yùn)算的一些妙用
常規(guī)操作: void swap(int a, int b) { int temp = a; a = b; b = temp; } 騷操作: void swap(int a, int b) { a^=b; b^=a; a^=b; }
常規(guī)操作: if (a%2 == 0) { System.out.println('偶數(shù)'); } else { System.out.println('奇數(shù)'); } 騷操作: if ((a&1) == 0) { System.out.println('偶數(shù)'); } else { System.out.println('奇數(shù)'); }
常規(guī)操作: int average(int x, int y) { return (x+y)/2; } 騷操作: int average(int x, int y) { return (x&y)+((x^y)>>1); } |
|
來(lái)自: 數(shù)數(shù)數(shù)據(jù)庫(kù) > 《腦》