位運算子主要包括下表中所列的幾種:
運算子含義
用法運算分類
~按位取反
~op1
按位運算
&按位與
op1&op2
|按位或
op1|op2
^按位異或
op1^op2
<<
左移op1《移位運算子
>>
右移op1>>op2
>>>
無符號右移
op1>>>op2
使用位運算實現乘法,利用的是左移符號。
舉例:不使用「*」,計算21*16的值。
分析:21轉換為二進位制為10101,16轉換為二進位制為10000.
10000等價於左移四位,所以21*16的值等價於將21的二進位制的值左移四位,使用**實現:
/**
* 使用移位運算子計算21*16
*/int a = 21; //轉換為二進位制為10101
int b = 16; //轉換為二進位制為10000
system.out.println("a="+a+",b="+b);
int c = a*b; //將a*b的值賦給c,用於比較移位運算子的結果準確性
int d = a<<4; //將a直接左移四位
system.out.println(c);
system.out.println(d);
計算結果均為336
延伸:計算21*21的值,同樣不使用「*」,而是用移位運算子計算。
思考:21的二進位制表示為10101,這次的乘數為21,不能簡單的使用左移運算子。
21*21,轉換為二進位制是10101*10101,由於二進位制運算的特殊性,可以拆分為10101*10000、10101*00100和10101*00001三個式子的和,如此看來,即將10101分別左移4位,左移2位和左移0位,然後求和。
利用**實現:
/**
* 使用移位運算子,計算21*21的值
*/int num1 =21; //21的二進位制值為10101
int num2 =21;
int num3 = 21*21; //宣告num3作對照
int num4 = (num1<<4)+(num1<<2)+num1;
system.out.println(num3);
system.out.println(num4);
計算結果均為441 位運算 90 64位整數乘法
求 a 乘 b 對 p 取模的值。輸入格式 第一行輸入整數 a,第二行輸入整數 b,第三行輸入整數 p。輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 1 a,b,p 1e18 輸入樣例 3 45輸出樣例 2差點粘個大數板子2333 思路 1.b b1 b2 b3 a b p a b1...
位運算 64位整數乘法
64位整數乘法題目鏈結 題目大意 求 a aa 乘 b bb 對 p pp 取模的值,其中 1 leq aa a,bb b,pp p leq 10 1810 1018 輸入格式 第一行輸入整數a aa,第二行輸入整數b bb,第三行輸入整數ppp。輸出格式 輸出乙個整數,表示 a b a ba bm...
Java 中的位運算
移位運算子 包括 右移 左移 無符號右移 例子 5 3 1 1111 1111 1111 1111 1111 1111 1111 1011 1111 1111 1111 1111 1111 1111 1111 1111 其結果與 math.floor double 5 2 2 2 完全相同。5 3 ...