java位運算或
㈠ 求:java中常用位運算符及其用法詳解
位運算符
位運算是以二進制位為單位進行的運算,其操作數和運算結果都是整型值。
位運算符共有7個,分別是:位與(&)、位或(|)、位非(~)、位異或(^)、右移(>>)、左移(<<)、0填充的右移(>>>)。
位運算的位與(&)、位或(|)、位非(~)、位異或(^)與邏輯運算的相應操作的真值表完全相同,其差別只是位運算操作的操作數和運算結果都是二進制整數,而邏輯運算相應操作的操作數和運算結果都是邏輯值。
位運算示例
運算符 名稱 示例 說明
& 位與 x&y 把x和y按位求與
| 位或 x|y 把x和y按位求或
~ 位非 ~x 把x按位求非
^ 位異或 x^y 把x和y按位求異或
>> 右移 x>>y 把x的各位右移y位
<< 左移 x<<y 把x的各位左移y位
>>> 右移 x>>>y 把x的各位右移y位,左邊填0
舉例說明:
(1)有如下程序段:
int x = 64; //x等於二進制數的01000000
int y = 70; //y等於二進制數的01000110
int z = x&y //z等於二進制數的01000000
即運算結果為z等於二進制數01000000。位或、位非、位異或的運算方法類同。
(2)右移是將一個二進制數按指定移動的位數向右移位,移掉的被丟棄,左邊移進的部分或者補0(當該數為正時),或者補1(當該數為負時)。這是因為整數在機器內部採用補碼表示法,正數的符號位為0,負數的符號位為1。例如,對於如下程序段:
int x = 70; //x等於二進制數的01000110
int y = 2;
int z = x>>y //z等於二進制數的00010001
即運算結果為z等於二進制數00010001,即z等於十進制數17。
對於如下程序段:
int x = -70; //x等於二進制數的11000110
int y = 2;
int z = x>>y //z等於二進制數的11101110
即運算結果為z等於二進制數11101110,即z等於十進制數-18。要透徹理解右移和左移操作,讀者需要掌握整數機器數的補碼表示法。
(3)0填充的右移(>>>)是不論被移動數是正數還是負數,左邊移進的部分一律補0。
㈡ Java中位運算符的具體應用是什麼,在實際編程中有什麼作用
位邏輯運算符有「與」(AND)、「或」(OR)、「異或(XOR)」、「非(NOT)」,分別用「&」、「|」、「^」、「~」表示。
下面的例子說明了位邏輯運算符:
//
Demonstrate
the
bitwise
logical
operators.
class
BitLogic
{
public
static
void
main(String
args[])
{
String
binary[]
=
{
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
"1111"
};
int
a
=
3;
//
0
+
2
+
1
or
0011
in
binary
int
b
=
6;
//
4
+
2
+
0
or
0110
in
binary
int
c
=
a
|
b;
int
d
=
a
&
b;
int
e
=
a
^
b;
int
f
=
(~a
&
b)
|
(a
&
~b);
int
g
=
~a
&
0x0f;
System.out.println("
a
=
"
+
binary[a]);
System.out.println("
b
=
"
+
binary[b]);
System.out.println("
a|b
=
"
+
binary[c]);
System.out.println("
a&b
=
"
+
binary[d]);
System.out.println("
a^b
=
"
+
binary[e]);
System.out.println("~a&b|a&~b
=
"
+
binary[f]);
System.out.println("
~a
=
"
+
binary[g]);
}
}
在本例中,變數a與b對應位的組合代表了二進制數所有的
4
種組合模式:0-0,0-1,1-0,和1-1。「|」運算符和「&」運算符分別對變數a與b各個對應位的運算得到了變數c和變數d的值。對變數e和f的賦值說明了「^」運算符的功能。字元串數組binary代表了0到15對應的二進制的值。在本例中,數組各元素的排列順序顯示了變數對應值的二進制代碼。數組之所以這樣構造是因為變數的值n對應的二進制代碼可以被正確的存儲在數組對應元素binary[n]中。例如變數a的值為3,則它的二進制代碼對應地存儲在數組元素binary[3]中。~a的值與數字0x0f
(對應二進制為0000
1111)進行按位與運算的目的是減小~a的值,保證變數g的結果小於16。因此該程序的運行結果可以用數組binary對應的元素來表示。
㈢ JAVA位運算符
運算符含義示例
~按位非(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
當然同樣有&=,|=,^=,>>=,>>>=,<<=。
有關這些操作的細節可以參看
http://www.pcvc.net/category/content.asp?sendid=247
位運算
前面介紹的各種運算都是以位元組作為最基本位進行的。但在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能,這使得C語言也能像匯編語言一樣用來編寫系統程序。
一、位運算符C語言提供了六種位運算符:
&按位與
|按位或
^按位異或
~取反
<<左移
>>右移
1.按位與運算按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下:00001001(9的二進制補碼)&00000101(5的二進制補碼)00000001(1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a的高八位清0,保留低八位,可作a&255運算(255的二進制數為0000000011111111)。
main(){
inta=9,b=5,c;
c=a&b;
printf("a=%d b=%d c=%d ",a,b,c);
}
2.按位或運算按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下:00001001|00000101
00001101(十進制為13)可見9|5=13
main(){
inta=9,b=5,c;
c=a|b;
printf("a=%d b=%d c=%d ",a,b,c);
}
3.按位異或運算按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:00001001^0000010100001100(十進制為12)
main(){
inta=9;
a=a^15;
printf("a=%d ",a);
}
4.求反運算求反運算符~為單目運算符,具有右結合性。其功能是對參與運算的數的各二進位按位求反。例如~9的運算為:~(0000000000001001)結果為:1111111111110110
5.左移運算左移運算符「<<」是雙目運算符。其功能把「<<」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,
高位丟棄,低位補0。例如:a<<4指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6.右移運算右移運算符「>>」是雙目運算符。其功能是把「>>」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設a=15,a>>2表示把000001111右移為00000011(十進制3)。應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1取決於編譯系統的規定。TurboC和很多系統規定為補1。
㈣ JAVA位運算符
運算符 含義 示例
~ 按位非(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
當然同樣有 &=,|=,^=,>>=,>>>=,<<=。
有關這些操作的細節可以參看
www.pcvc.net/...id=247
位運算
前面介紹的各種運算都是以位元組作為最基本位進行的。 但在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統程序。
一、位運算符C語言提供了六種位運算符:
& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移
1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2. 按位或運算 按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下: 00001001|00000101
00001101 (十進制為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. 按位異或運算 按位異或運算符「^」是雙目運算符。
㈤ 請教java位運算問題
Java 位運算 Java 位運算[轉]一,Java 位運算1.表示方法: 在Java語言中,二進制數使用補碼表示,最高位為符號位,正數的符號位為0,負數為1。補碼的表示需要滿足如下要求。 (l)正數的最高位為0,其餘各位代表數值本身(二進制數)。 (2)對於負數,通過對該數絕對值的補碼按位取反,再對整個數加1。2.位運算符 位運算表達式由操作數和位運算符組成,實現對整數類型的二進制數進行位運算。位運算符可以分為邏輯運算符(包括~、&、|和^)及移位運算符(包括>>、>)。1)左移位運算符()則將運算符左邊的運算對象向右移動運算符右側指定的位數。「有符號」右移位運算符使用了「符號擴展」:若值為正,則在高位插入0;若值為負,則在高位插入1。3)Java也添加了一種「無符號」右移位運算符(>>>),它使用了「零擴展」:無論正負,都在高位插入0。這一運算符是C或C++沒有的。
㈥ JAVA位運算符
然後呢?位運算怎麼了?
說說位運算常用的幾種吧。
首先基本概念:
你要明白 "與" 和 "或" 都代表什麼意思,「與」表示同時滿足,也稱同時為真,然後其結果才能為滿足或真,否者一概為不滿足或假;"或"表示只需要滿足一個,也可以說只要一個為真,然後其結果就為滿足或者,除非兩個都不滿足,其結果才表示不滿足。
接下來說常用的4種位運算符:按位與(&)、按位或(|)、帶符號左移(<<)、帶符號右移(>>)
& 表示按位與,需要按位的意思是,首先將符號兩邊均換算成二進制,然後按位做 與 操作,沒有內容的以0計算。比如,1&7 相當於 001 &111 相當於 0&1 0&1 1&1 最後得到結果 001 也就是1 ;
| 表示按位或,其他內容與&一致,只有換成二進制後做的操作時 按位或,同上例:1|7 相當於 001|111 相當於 0|1 0|1 1|1 最後得到結果 111 也就是 7;
<< 表示左移,舉例說明: 7 << 1 首先只將符號左側內容換算成二進制 111 然後,向左移位,需要移多少位?這時候就用到符號右側的數字1,即表示移1位,缺失的依舊補0,所以就變成了1110,也就是14
>> 表示右移,和左移一樣,比如 7>>1 就表示 111向右移動一位,就變成了11,多餘的位會被舍棄.
還有其他的不太常用的 比如 按位 異或 , 無符號移位運算,如果感興趣,也可以去了解
㈦ java 按位運算
你的這個設計有問題。
位運算來進行邏輯判斷,其實就是用數字的二進制各位來做標志。通過位運算,進行許可權的組合和拆分。
這樣有個基礎:就是每個許可權的值正好要是二進制位的對應值。
許可權可以取的數就是二進制的進度值。如:1,2,4,8,16,32……(不超過數字表達范圍)。
看你的題目: 3是發帖,4是刪帖。要用二進制來做掩碼計算。設計不科學。
兩個方法:
1 建議使用1,2,4,8……來定義的你的許可權。
如果改成:4是發帖,8是刪帖
long power=4|8;
判斷是否有發帖許可權:power&4 >0
2 如果一定要用1,2,3,4來定義,那麼要做進制操作。
long power=(1<<(3-1))|(1<<(4-1));
判斷是否有發帖許可權:(power&(1<<(3-1))) > 0
註:如果上面都不減去1,也行,就浪費一個位置。
㈧ JAVA位運算符
位操作符(bitwise operator)
位操作符允許我們操作一個基本數據類型中的整數型值的單個「比特(bit)」,即二進制位。
位操作符會對兩個參數對應的位執行布爾代數運算,並最終生成一個結果。
位操作符來源於 C 語言面向底層的操作,那時我們經常需要直接操縱硬體,設置硬體寄存
器內的二進制位。Java的設計初衷是嵌入電視機頂盒內,所以這種低級操作仍被保留了下來。
但是,我們可能不會過多地使用到位運算符。
如果兩個輸入位都是 1,則按位「與」操作符(&)生成一個輸出位 1;否則生成一個輸出
位0。如果兩個輸入位里只要有一個是1,則按位「或」操作符(|)生成一個輸出位1;只
有在兩個輸入位都是0的情況下,它才會生成一個輸出位0。如果兩個輸入位的某一個是1,
但不全都是1,那麼「異或」操作(^)生成一個輸出位1。按位「非」(~ ,也稱為取補運
算,ones compliement operator )屬於一元操作符;它只對一個操作數進行操作(其他位操
作是二元運算)。按位「非」生成與輸入位相反的值——若輸入0,則輸出1;輸入1,則輸
出0。
位操作符和邏輯操作符都使用了同樣的符號。因此,我們能方便地記住它們的含義:由於「位」
是非常「小」的,所以位操作符僅使用了一位符號。
位操作符可與等號(=)聯合使用,以便合並運算操作和賦值操作:&=,|=和^=都是合法
的(由於~是一元操作符,所以不可與=聯合使用)。
我們將布爾類型(boolean)作為一種「單比特」值對待,所以它多少有些獨特的地方。我們
可對它執行按位「與」、「或」和「異或」運算,但不能執行按位「非」(大概是為了避免與
邏輯 NOT 混淆)。對於布爾值,位操作符具有與邏輯操作符相同的效果,只是它們不會中
途「短路」。此外,針對布爾值進行的按位運算為我們新增了一個「異或」邏輯操作符,它並
未包括在「邏輯」操作符的列表中。在移位表達式中,我們被禁止使用布爾運算,原因將在下
面解釋。
移位操作符(shift operator)
移位操作符操作的運算對象也是二進制的「位」,但是它們只可以被用來處理整數類型(基本
類型的一種)。左移位操作符(<<)能將操作符左邊的運算對象向左移動操作符右側指定的
位數(在低位補 0)。「有符號」右移位操作符(>>)則將操作符左邊的運算對象向右移動操
作符右側指定的位數。「有符號」右移位操作符使用了「符號擴展」:若符號為正,則在高位插
入0;若符號為負,則在高位插入1。Java中增加了一種「無符號」右移位操作符(>>>),它
使用了「零擴展」:無論正負,都在高位插入0。這一操作符是C或C++沒有的。
如果對char、byte或者short類型的數值進行移位處理,那麼在移位進行之前,它們會自動
轉換為int,並且得到的結果也是一個int類型的值。而右側操作數,作為真正移位的位數,
只有其二進製表示中的低5位才有用。這樣可防止我們移位超過int型值所具有的位數。(譯
註:因為2的5次方為32,而int型值只有32位)。若對一個long類型的數值進行處理,
最後得到的結果也是long。此時只會用到右側操作數的低6位,以防止移位超過long型數
值具有的位數。
移位可與等號(<<=或>>=或>>>=)組合使用。此時,操作符左邊的值會移動由右邊的值指
定的位數,再將得到的結果賦回左邊的變數。但在進行「無符號」右移結合賦值操作時,可能
會遇到一個問題:如果對byte或short值進行這樣的移位運算,得到的可能不是正確的結果。
它們會先被轉換成int類型,再進行右移操作。然後被截斷,賦值給原來的類型,在這種情
況下可能得到-1的結果。下面這個例子演示了這種情況:
//: c03:URShift.java
// Test of unsigned right shift.
import com.bruceeckel.simpletest.*;
public class URShift {
static Test monitor = new Test();
public static void main(String[] args) {
int i = -1;
System.out.println(i >>>= 10);
long l = -1;
System.out.println(l >>>= 10);
short s = -1;
System.out.println(s >>>= 10);
byte b = -1;
System.out.println(b >>>= 10);
b = -1;
System.out.println(b>>>10);
monitor.expect(new String[] {
"4194303",
"18014398509481983",
"-1",
"-1",
"4194303"
});
}
} ///:~
在最後一個移位運算中,結果沒有賦回給b,而是直接列印出來,所以其結果是正確的。
下面這個例子向大家闡示了如何應用涉及「按位」操作的所有操作符:
//: c03:BitManipulation.java
// Using the bitwise operators.
import com.bruceeckel.simpletest.*;
import java.util.*;
public class BitManipulation {
static Test monitor = new Test();
public static void main(String[] args) {
Random rand = new Random();
int i = rand.nextInt();
int j = rand.nextInt();
printBinaryInt("-1", -1);
printBinaryInt("+1", +1);
int maxpos = 2147483647;
printBinaryInt("maxpos", maxpos);
int maxneg = -2147483648;
printBinaryInt("maxneg", maxneg);
printBinaryInt("i", i);
printBinaryInt("~i", ~i);
printBinaryInt("-i", -i);
printBinaryInt("j", j);
printBinaryInt("i & j", i & j);
printBinaryInt("i | j", i | j);
printBinaryInt("i ^ j", i ^ j);
printBinaryInt("i << 5", i << 5);
printBinaryInt("i >> 5", i >> 5);
printBinaryInt("(~i) >> 5", (~i) >> 5);
printBinaryInt("i >>> 5", i >>> 5);
printBinaryInt("(~i) >>> 5", (~i) >>> 5);
long l = rand.nextLong();
long m = rand.nextLong();
printBinaryLong("-1L", -1L);
printBinaryLong("+1L", +1L);
long ll = 9223372036854775807L;
printBinaryLong("maxpos", ll);
long lln = -9223372036854775808L;
printBinaryLong("maxneg", lln);
printBinaryLong("l", l);
printBinaryLong("~l", ~l);
printBinaryLong("-l", -l);
printBinaryLong("m", m);
printBinaryLong("l & m", l & m);
printBinaryLong("l | m", l | m);
printBinaryLong("l ^ m", l ^ m);
printBinaryLong("l << 5", l << 5);
printBinaryLong("l >> 5", l >> 5);
printBinaryLong("(~l) >> 5", (~l) >> 5);
printBinaryLong("l >>> 5", l >>> 5);
printBinaryLong("(~l) >>> 5", (~l) >>> 5);
monitor.expect("BitManipulation.out");
}
static void printBinaryInt(String s, int i) {
System.out.println(
s + ", int: " + i + ", binary: ");
System.out.print(" ");
for(int j = 31; j >= 0; j--)
if(((1 << j) & i) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
static void printBinaryLong(String s, long l) {
System.out.println(
s + ", long: " + l + ", binary: ");
System.out.print(" ");
for(int i = 63; i >= 0; i--)
if(((1L << i) & l) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
} ///:~
程序末尾調用了兩個方法:printBinaryInt()和printBinaryLong()。它們分別接受
一個 int 或 long 值的參數,並用二進制格式輸出,同時附有簡要的說明文字。你可以暫
時忽略它們具體是如何實現的。
請注意這里是用 System.out.print(),而不是 System.out.println()。print()方法不自動換行,所
以我們能在同一行里輸出多個信息。
上面的例子中,expect() 以一個文件名作參數,它會從這個文件中讀取預期的行(其中
可以有,也可以沒有正則表達式)。對於那些太長,不適宜列在書里的輸出,這種做法很有
用。這個文件的擴展名是「.out」,是所發布的代碼的一部分,可以從www.BruceEckel.com下
載。如果有興趣的話,可以打開這個文件,看看正確的輸出應該是什麼(或者你自己直接運
行一下前面這個程序)。
上面的例子展示了對int和long的所有按位運算的效果,還展示了int和long的最小值、最
大值、+1和-1值,以及它們的二進制形式,以使大家了解它們在機器中的具體形式。注意,
最高位表示符號:0為正,1為負。下面列出例子中關於int部分的輸出:
-1, int: -1, binary:
+1, int: 1, binary:
maxpos, int: 2147483647, binary:
maxneg, int: -2147483648, binary:
i, int: 59081716, binary:
~i, int: -59081717, binary:
-i, int: -59081716, binary:
j, int: 198850956, binary:
i & j, int: 58720644, binary:
i | j, int: 199212028, binary:
i ^ j, int: 140491384, binary:
i << 5, int: 1890614912, binary:
i >> 5, int: 1846303, binary:
(~i) >> 5, int: -1846304, binary:
i >>> 5, int: 1846303, binary:
(~i) >>> 5, int: 132371424, binary:
數字的二進製表示形式被稱為「有符號的2的補碼」。