根據(jù)你提供的結(jié)果判斷,你說的這個(gè)“11000011"數(shù),不是二進(jìn)制,是個(gè)十進(jìn)制吧。
創(chuàng)新互聯(lián)專業(yè)提供雅安機(jī)房托管服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買雅安機(jī)房托管服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。
你把11000011化成二進(jìn)制補(bǔ)碼,然后右移兩位。把結(jié)果再轉(zhuǎn)換為十進(jìn)制就是“2750002”了。
java中使用補(bǔ)碼表示二進(jìn)制,正數(shù)的補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼是它的絕對值取反+1:
例如:
+3 二進(jìn)制位0000 0011(最高位為符號(hào)位,0正,1負(fù)),補(bǔ)碼為:0000 0011;
-3 絕對值二進(jìn)制位0000 0011,求反為1111 1100,補(bǔ)碼為1111 1101
對-32 ===== 1111 11012 結(jié)果為1111 1111(為補(bǔ)碼) 化成十進(jìn)制為-1;
可能說的不夠詳細(xì),僅供參考。。。。
左移一位相當(dāng)于乘以2,32 等于 2 的 5 次方,所以左移 5 位,即可算出 53 * 32 的值。代碼如下:
public?class?App47?{
public?static?void?main(String[]?args)?{
System.out.println(53??5);
System.out.println(53?*?32);
}
}
運(yùn)算符 含義 示例
~ 按位非(NOT) b = ~a
按位與(AND) c = a b
| 按位或(OR) c = a | b
^ 按位異或(XOR) c = a ^ b
右移 b = a 2
右移,左邊空出的位以0填充 b = a 2
左移 b = a 1
當(dāng)然同樣有 =,|=,^=,=,=,=。
有關(guān)這些操作的細(xì)節(jié)可以參看
位運(yùn)算
前面介紹的各種運(yùn)算都是以字節(jié)作為最基本位進(jìn)行的。 但在很多系統(tǒng)程序中常要求在位(bit)一級(jí)進(jìn)行運(yùn)算或處理。C語言提供了位運(yùn)算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統(tǒng)程序。
一、位運(yùn)算符C語言提供了六種位運(yùn)算符:
按位與
| 按位或
^ 按位異或
~ 取反
左移
右移
1. 按位與運(yùn)算 按位與運(yùn)算符""是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相與。只有對應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1 ,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。
例如:95可寫算式如下: 00001001 (9的二進(jìn)制補(bǔ)碼)00000101 (5的二進(jìn)制補(bǔ)碼) 00000001 (1的二進(jìn)制補(bǔ)碼)可見95=1。
按位與運(yùn)算通常用來對某些位清0或保留某些位。例如把a(bǔ) 的高八位清 0 , 保留低八位, 可作 a255 運(yùn)算 ( 255 的二進(jìn)制數(shù)為0000000011111111)。
main(){
int a=9,b=5,c;
c=ab;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2. 按位或運(yùn)算 按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相或。只要對應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。
例如:9|5可寫算式如下: 00001001|00000101
00001101 (十進(jìn)制為13)可見9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3. 按位異或運(yùn)算 按位異或運(yùn)算符“^”是雙目運(yùn)算符。
Java代碼:
public class test{ public static void main(String[] args) { String source = "cghjhgfgsdyugh"; int ch = source.charAt(0); for(int i=1; isource.length(); i++) { ch ^= source.charAt(i); } System.out.printf("%d : %c\n", ch, ch); }}
運(yùn)行測試:
28 :
樓上是錯(cuò)的...
public class Test
{
public static void main(String[] args)
{
byte b=(byte)0xf1 ;
byte d=(byte)(b4);
System.out.println(d);
byte a=(byte)0xf1;
byte e=(byte)((a0xff)4);
System.out.println(e);
}
}
輸出為
-1
15
解釋如下:
問題1:
1.0xf1,這是直接書寫的文字常量,java默認(rèn)情況下表示int型,即0x000000f1
2.(byte)0xf1,是將int顯示轉(zhuǎn)化為byte,即強(qiáng)行截?cái)嗳∽畹妥止?jié),即取0x000000f1的最低字節(jié)0xf1,所以得到的byte在內(nèi)存里是0xf1,因?yàn)閎yte是有符號(hào)的,所以b是負(fù)數(shù)
3.位移會(huì)先將左邊的數(shù)轉(zhuǎn)化為int,再位移;負(fù)數(shù)擴(kuò)展左邊添1,所以0xf1擴(kuò)展為0xfffffff1,添0右移4位結(jié)果是0x0fffffff
4.最后將int型的0x0fffffff顯示轉(zhuǎn)化為byte,即截?cái)嘧畹妥止?jié),得到0xff,即byte值的-1,所以輸出為-1
問題2:
同理
1.(byte)0xf1是截?cái)鄆nt值的最低字節(jié)得到0xf1,也是一個(gè)byte型負(fù)數(shù)
2.b0xff,左邊是byte型,右邊的文字常量默認(rèn)是int型,所以左邊的byte先為擴(kuò)展為0xffffffff的int型,與右邊的int值位與,所以b0xff的最終結(jié)果是int型的0x000000ff
3.將b0xff按符號(hào)位擴(kuò)展右移4位,得到0x0000000f,最后截?cái)嘧畹妥止?jié)得到byte值0x0f,所以e為0x0f,輸出得到15
ok,就是這樣