JAVA逐位代码用途,&

时间:2018-07-09 12:17:05

标签: java bitwise-operators

// following code prints out Letters aA bB cC dD eE ....

class UpCase {
public static void main(String args[]) {
 char ch;

 for(int i = 0; i < 10; i++) {
  ch = (char)('a' + i);
  System.out.print(ch);

  ch = (char)((int) ch & 66503);

  System.out.print(ch + " ")
  }
 }
}

仍在学习Java,但努力理解按位运算。两种代码都可以,但是我不理解这些代码背后的二进制原因。为什么(int)会回退到ch,而66503的用途是什么,使其能够打印出不同的字母大写。

//following code displays bits within a byte

class Showbits {
  public static void main(String args[]) {
  int t;
  byte val;

  val = 123;
  for(t = 128; t > 0; t = t/2) {
   if((val & t) != 0) 
    System.out.print("1 ");
    else System.out.print("0 ");
   }

  }
 }
 //output is 0 1 1 1 1 0 1 1

对于此代码的输出,实现它​​的步骤细分是什么?如果123是01111011和128以及64和32是10000000不应该输出000000000?与&将0变成0的任何东西?真的很困惑。

2 个答案:

答案 0 :(得分:2)

第二段代码(显示位):

代码实际上正在转换decimal to binary。该算法使用了一些魔术,主要是AND(&) operator

考虑数字123 = 01111011128 = 10000000。当我们将它们与在一起时,我们得到0或非零数字,具体取决于1中的1281或{{1} }。

0

在这种情况下,答案是 10000000 & 01111011 ---------- 00000000 ,我们的第一位为0。 展望未来,我们将064 = 01000000相加。注意123向右移动。

1

这次与123进行与运算将产生一个非零数字,第二位为1。重复此过程。

第一段代码(大写):

此处65503是32的negation

  01000000
& 01111011
----------
  01000000

从本质上讲,我们通过对32取反,将与小写字母的值相减32。众所周知,从小写ASCII值字符中减去32会将其转换为大写。

答案 1 :(得分:0)

大写

由32位带符号整数表示的十进制数字66503是二进制形式的00000000 00000001 00000011 11000111

由8位字符表示的ASCII字母a01100001二进制(十进制为97)。

将char转换为32位带符号整数会得到00000000 00000000 00000000 01100001

&将两个整数加在一起得出:

00000000 00000000 00000000 01100001
00000000 00000001 00000011 11000111
===================================
00000000 00000000 00000000 01000001
转换回char的

给出01000001,即十进制65,即ASCII字母A

显示位

不知道为什么您认为1286432都是10000000。它们显然不能是相同的数字,因为它们是不同的数字。 10000000是十进制的128

for循环的工作从128开始,并经历每2个连续的下一个最小幂2:6432168421

这些是以下二进制数字:

128: 10000000
 64: 01000000
 32: 00100000
 16: 00010000
  8: 00001000
  4: 00000100
  2: 00000010
  1: 00000001

因此,在每个循环中,&将给定值与这些数字中的每个数字一起使用,当结果为"0 "时打印0,否则返回"1 "

示例:

val123,即01111011

所以循环看起来像这样:

128: 10000000 & 01111011 = 00000000 -> prints "0 "
 64: 01000000 & 01111011 = 01000000 -> prints "1 "
 32: 00100000 & 01111011 = 00100000 -> prints "1 "
 16: 00010000 & 01111011 = 00010000 -> prints "1 "
  8: 00001000 & 01111011 = 00001000 -> prints "1 "
  4: 00000100 & 01111011 = 00000000 -> prints "0 "
  2: 00000010 & 01111011 = 00000010 -> prints "1 "
  1: 00000001 & 01111011 = 00000001 -> prints "1 "

因此最终输出为"0 1 1 1 1 0 1 1",这是正确的。