JAVA學(xué)習(xí)(4)位運算
只需要記住16進(jìn)制的2 、4、8、C 就能記住二進(jìn)制碼
轉(zhuǎn)換方式有2種
1.先轉(zhuǎn)換成10進(jìn)制,再轉(zhuǎn)成2進(jìn)制
2.直接轉(zhuǎn)換成2進(jìn)制
2進(jìn)制轉(zhuǎn)16進(jìn)制:
同16進(jìn)制轉(zhuǎn)2進(jìn)制,只是每4位拼湊一個16進(jìn)制數(shù),不夠補(bǔ)0
或 |運算,二進(jìn)制中每一位進(jìn)行比較,兩個數(shù)據(jù)有一個或全部為1時,此位為1
4:0100
8:1000
:1100 = 0xc = 12
public class Test4{
public static void main(String[] args)
{
int x = 4;
int y = 8;
System.out.println(x|y);//輸出12
}
}
與 &運算,二進(jìn)制中每一位進(jìn)行比較,兩個數(shù)據(jù) 全部為1時,此位為1
4:0100
8:1000
:0000 = 0x0= 0
public class Test4{
public static void main(String[] args)
{
int x = 4;
int y = 8;
System.out.println(x&y);//輸出0
}
}
異或 ^ 運算,同一位相同為0,不同為1
4:0100
8:1000
:1100 = 0xc= 12
public class Test4{
public static void main(String[] args)
{
int x = 4;
int y = 8;
System.out.println(x^y);//輸出12
}
}
取反 ~ 運算, 1變0,0變1 實際上相當(dāng)于每一個字節(jié)=0xFF(255)-當(dāng)前值
但是在java中,他經(jīng)過這樣運算得出的結(jié)果再被256減,才是正確的值。他的運算可以簡化成 (當(dāng)前值+1)*-1
這里為了方便觀察 用byte類型
JAVA
~8=255-8 -256 =-8 -256+255 = -8-1
~8= (8+1)*-1
~4 =255-4-256 =-4-1
~4 = (4+1)*-1
public class Test4{
public static void main(String[] args)
{
byte x = 4;
byte y = 8;
System.out.println(~x);//輸出-5
System.out.println(~y);//輸出-9
}
}
C語言
~8= 255-8
~4 =255-4
typedef unsigned char BYTE;
int main()
{
BYTE x = ~4;
printf("%d", x);//251
x = ~8;
printf("%d", x);//247
}
左移 和
右移
正數(shù)右移,空位補(bǔ)0,負(fù)數(shù)空位補(bǔ)0xF( 這里是針對移動1個16進(jìn)制位長度而不是1位,移動4位=移動1個16進(jìn)制長度
1字節(jié)情況自己測試,理論上是補(bǔ)1和0)
空位以0填充,負(fù)數(shù)先還原成正數(shù),進(jìn)行運算,再取負(fù),
左移,不管正負(fù)數(shù),空位全補(bǔ)0
以下是調(diào)試器測試結(jié)果
左移補(bǔ)位:
int x = -0x123;
int z = x << 4;
int x2 = 0x123;
int z2 = x2 << 4;
右移補(bǔ)位:
int x = -0x123;
int z = x >>4;
int x2 = 0x123;
int z2 = x2 >> 4;
4:0100 左移1位
:1000 =8
8:1000 右移1位
: 0100
public class Test4{
public static void main(String[] args)
{
byte x = 4;
byte y = 8;
byte z = -8;
System.out.println(x<<1);//輸出8
System.out.println(y>>1);//輸出4
System.out.println(z>>1);//輸出-4
}
}
左移常做平方運算,左移N位 = 數(shù)據(jù)*2的N次方
異或 、與運算,在C語言中常做參數(shù)類型過濾,比如MessageBox的按鈕樣式MB_OK,MB_YES就是這種實現(xiàn)。
更多的應(yīng)用實在代碼混淆,反調(diào)試跟蹤中