// 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的任何东西?真的很困惑。
答案 0 :(得分:2)
第二段代码(显示位):
代码实际上正在转换decimal to binary。该算法使用了一些魔术,主要是AND(&) operator。
考虑数字123 = 01111011
和128 = 10000000
。当我们将它们与在一起时,我们得到0
或非零数字,具体取决于1
中的128
与1
或{{1} }。
0
在这种情况下,答案是 10000000
& 01111011
----------
00000000
,我们的第一位为0。
展望未来,我们将0
与64 = 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字母a
为01100001
二进制(十进制为97)。
将char转换为32位带符号整数会得到00000000 00000000 00000000 01100001
。
&
将两个整数加在一起得出:
00000000 00000000 00000000 01100001
00000000 00000001 00000011 11000111
===================================
00000000 00000000 00000000 01000001
转换回char的给出01000001
,即十进制65,即ASCII字母A
。
显示位
不知道为什么您认为128
,64
和32
都是10000000
。它们显然不能是相同的数字,因为它们是不同的数字。 10000000
是十进制的128
。
for循环的工作从128
开始,并经历每2个连续的下一个最小幂2:64
,32
,16
,8
,4
,2
和1
。
这些是以下二进制数字:
128: 10000000
64: 01000000
32: 00100000
16: 00010000
8: 00001000
4: 00000100
2: 00000010
1: 00000001
因此,在每个循环中,&
将给定值与这些数字中的每个数字一起使用,当结果为"0 "
时打印0
,否则返回"1 "
。
示例:
val
是123
,即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"
,这是正确的。