求助!将java中int类型在内存中的二进制形式,按位输出。

fanfan9527 2011-09-01 04:38:22
RT.
今天闲来无事,突然想看看亲眼看看数据在内容中的二进制表示。
下面是关键代码:
当变量x为正数的时候,结果是正确的。但是为负数的时候最高位却是0.其实应该为1。
-3的补码是:1111 1111 1111 1111 1111 1111 1111 1101
但是以下代码输出的结果是 0111 1111 1111 1111 1111 1111 1111 1101。最高位不正确。求知情人士帮忙分析一下啊。
int x = -3;
for(int i=31;i>=0;i--) {
System.out.print(((x&(int)Math.pow(2,i))>>>i)+" ");
}
说一下我的思路,x&(int)Math.pow(2,i)从最高位开始依次分离每一位上的数据。然后就是把分离出来的数据转换成一个int类型,打印出来。
...全文
342 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
(int) Math.pow(2, i) 当 i = 31 时得到的值为 2147483647,这个值是 Integer.MAX_VALUE 也就是:

0111 1111 1111 1111 1111 1111 1111 1111

最高位为 0,跟负数进行位与运算时,符号位会被清为 0,你的代码改成这样就可以用了:

for (int i = 31; i >= 0; i--) {
System.out.print(((x & (1 << i)) >>> i) + " ");
}


再简单一些就是这样:

for (int i = 31; i >= 0; i--) {
System.out.print(((x >>> i) & 1) + " ");
}
  • 打赏
  • 举报
回复
public static void main(String[] args) {
int n = -3;
char[] chs = new char[Integer.SIZE];
for (int i = 0, p = i - 1; i < chs.length; i++, p--) {
chs[i] = (char)('0' + ((n >> p) & 1));
}
System.out.println(new String(chs));
}
fanfan9527 2011-09-02
  • 打赏
  • 举报
回复
哇!受益匪浅啊,谢谢火龙果。昨天晚上我已经发现问题所在了,相比之下,火龙果的代码比我要干练得多了,佩服。尤其是用1的左移操作来代替(int)Math.pow(2,i)。感谢。
fanfan9527 2011-09-01
  • 打赏
  • 举报
回复
哥,我只是想问问我列出的代码有什么逻辑问题,你给我说什么反编译的,干什么呢。。。
千与 2011-09-01
  • 打赏
  • 举报
回复
这个比较常用
javap -c -s -l -verbose YourClass
千与 2011-09-01
  • 打赏
  • 举报
回复
或者编译时:
javac -g YourClass.java
千与 2011-09-01
  • 打赏
  • 举报
回复
反编译一下:
javap -c YourClass
fanfan9527 2011-09-01
  • 打赏
  • 举报
回复
谢谢shirdrn的回答。实际上我是想了解我列出的代码的问题,有点想不明白。
千与 2011-09-01
  • 打赏
  • 举报
回复
int i=214332;
System.out.println(Integer.toBinaryString(i));
// 110100010100111100

你也可以通过Integer的toHexString方法查看十六进制字符串表示。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧