A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Faulty

初级黑马

  • 黑马币:0

  • 帖子:5

  • 精华:0

© Faulty 初级黑马   /  2013-10-30 22:39  /  918 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. public class Xiaohuihui {
  2.         public static void main(String[] args) {
  3.                 int a = Integer.MAX_VALUE;
  4.                 int b = 12;
  5.                 a = a + b;
  6.                 b = a - b;
  7.                 a = a - b;
  8.                 System.out.println(Integer.MAX_VALUE);
  9.                 System.out.println(a);
  10.                 System.out.println(b);
  11.         }
  12. }
复制代码
不是说这种方法存在bug吗,为什么没有找到

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 miedongdong 于 2013-10-30 22:55 编辑

没说过这个会有bug吧
这个也可以用位运算符之中的异或运算 ^
^的原理说明:(实际上是二进制运算)
相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
例子:6^5
6 的二进制表示:    110
5的二进制表示:   ^101
                           ————
                    011
下面的实现原理就是异或运算后再异或同一个数
异或运算后的数     011
5的二进制表示:  ^ 101
                           ————
                               110  (这就是6的二进制数)

                  
  
02.public class Xiaohuihui {

03.        public static void main(String[] args) {

04.                int a = Integer.MAX_VALUE;

05.               int b = 12;
                    a =a ^ b;
                    b= a^b;
                    a= a^b;

06.           /*     a = a + b;

07.                b = a - b;

08.                a = a - b;   */

09.                System.out.println(Integer.MAX_VALUE);

10.                System.out.println(a);

11.                System.out.println(b);

12.        }

13.}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
miedongdong 发表于 2013-10-30 22:53
没说过这个会有bug吧
这个也可以用位运算符之中的异或运算 ^
^的原理说明:(实际上是二进制运算)

毕老师说是有bug的 就是当两个数之和超过int类型时会溢出 我也一直是这样觉得的 但楼主说的这个问题我刚才测试过的确地可以转换的 而且两数之和也的确溢出了 要么是毕老师说错了我自己也理解错了 要么就是还有哪里没注意到  求高手指点
回复 使用道具 举报
ixiangfeng 发表于 2013-10-30 23:18
毕老师说是有bug的 就是当两个数之和超过int类型时会溢出 我也一直是这样觉得的 但楼主说的这个问题我刚 ...

哦哦,当时老师是有说过如果两个数很大的话,就有可能会超出范围,但是一般都没用到这么大的数
你测试异或也超出了吗?怎么我的没有,正常运行啊,而且老师说到用异或是不会超出范围的
回复 使用道具 举报
miedongdong 发表于 2013-10-30 23:28
哦哦,当时老师是有说过如果两个数很大的话,就有可能会超出范围,但是一般都没用到这么大的数
你测试异 ...

老师说的是异或是不会超出的 而楼主所说的方式会的 而且LZ用的是Integer.MAX_VALUE和别一数相加 按毕老师说的话应该会超出范围的 但测试出来的结果两个数还是可以正常交换的 具体什么原因还不清楚 再去仔细想想去
回复 使用道具 举报
因为是int,所以a=a+b,当a和b很大时,a容易超出int范围。所以有 一定危险。
回复 使用道具 举报
回天之力 发表于 2013-10-31 00:24
因为是int,所以a=a+b,当a和b很大时,a容易超出int范围。所以有 一定危险。

呃 哥们 你有没有看帖子的 人家就是测试出来没有你说的这种情况所以才发帖来问的
回复 使用道具 举报
//小练习:将两个变量内部的值进行互换。

//1,通过第三方变量。
int temp;
temp =n;
n=m;
m=temp;
//2,不用第三方变量
/*
11=3+8
8=11-3
2=11-8
*/
n=n+m;
m=n-m;
n=n-m;//但是,这种方法有局限性,如果n,m值非常大,则会超出int范围。

n=n^m;
m=n^m;//^:亦或.。此时的表达式是:(n^m)^m【但是,此时m的值已经变为之前的n的值了】
n=n^m;//                 此时的表达式是:(n^m)^n
//一个数,如果同时对一个数异或两次,那就是原数。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马