2012-03-11 56 views
0

我要做Boolean操作一樣,Java的逐位也

B1=00 10 11 01 00 
B2=00 10 11 01 
B1 NOR B2 =11 11 11 11 

怎麼可能在Java中?任何人都可以幫忙嗎?

對不起,我忘了提及,是否有可能在Java中從左邊執行這種按位操作的NOR操作而始終沒有移位(B2的位數較少)?

+0

做逐位或'|',然後按位不'〜'。 – twain249 2012-03-11 22:42:43

+0

你如何獲得B1和B2? '字節'? '位[]'? 'integer []'? 'char []'? – 2012-03-11 22:43:45

+2

你確定你沒有要求XNOR嗎? b1 xnor b2是11 11 11 11根據你的例子... – Tung 2012-03-11 22:43:46

回答

2

如果b1b2是你(INT)的變量,表達式爲:

~(b1 | b2) 

欲瞭解更多信息,請參閱Bitwise and Bit Shift Operators

但是,在您的示例中,變量具有不同的長度。結果也不對應於NOR。

更新:如果你有布爾值的兩個序列,沒有平等的大小,只需要(從左至右),它的一部分,我建議使用一個BitSet

BitSet b1 = new BitSet(); 
// Fill it with booleans: 
for (int i = 0 ; i < myBooleans.length ; i++) 
    b1.set(i, myBooleans[i]); 
// Or fill it with bytes: 
BitSet b1 = BitSet.valueOf(myBytes); 
// Or fill it with 0/1 from a string: 
for (int i = 0 ; i < myString.length() ; i++) 
    b1.set(i, myString.charAt(i) == "1"); 

BitSet b2 = new BitSet(); 
// Same as above 

BitSet result = new BitSet(); 
result.or(b1); // Copies b1 
result.or(b2); // Makes the OR 
result.flip(0,result.size()); // Negates - the result is a NOR 
result.clear(Math.min(b1.size(), b2.size()), result.size()); // Only retain the common size 

如果你真的想要使用int,那麼最好從右到左表示它(即第一位是b % 2,第二位是b/2 % 2等)。然後,你只需要按照開始時所述的那樣進行NOR操作,並且如果需要的話截斷結果

如果它們是從左到右代表,我認爲除非用0填充(例如:B1=0010 1101 0000 0000 0000 0000 0000 0000B2=0010 1101 0000 0000 0000 0000 0000 0000),否則將需要轉換(或乘法/除法,本質上是同一件事,但更昂貴...)。在這種情況下,您可以正常進行操作。

+0

對不起,我忘記了,是否有可能在Java中從左邊執行這種按位操作的NOR操作而不移位或添加位(B2的位數較少)? – Arpssss 2012-03-11 22:48:18

+0

B1和B2如何表示? (int,boolean [],String ...)或者也許你還沒有選擇一個表示,並且也需要一個建議? – mgibsonbr 2012-03-11 22:50:44

+0

我已選擇INT。 – Arpssss 2012-03-11 22:56:59

2

也不僅僅是「不是」,所以只是按位或倒置。

B1 nor B2 = ~(B1|B2);

您的示例沒有意義,我雖然。爲什麼(2'b11 NOR 2'b11) = 2'b11?

2

與B2 XOR B1,那麼 「不」 的結果:

B1 xnor B2 = ~(B1^B2) 
+0

謝謝,但它給不正確的位帶來錯誤的結果。因爲它從左邊進行XNOR操作。 – Arpssss 2012-03-11 23:09:17