黑马程序员技术交流社区

标题: 位移中的那个事 [打印本页]

作者: 晏文根    时间: 2012-6-11 14:40
标题: 位移中的那个事
在学毕老师的java基础视频第二天中的位移运算符是。虽然明白了,老师讲的右移等概念。但后来发现老师举得例子,例如:
6>>2; 3>>1都是后面的数字比前面大,这我都明白了,但小弟不才,明白不了后者。就是加入后面的数大于前者该怎么办呀?
例如:求6>>8;     7>>12  ;  25>>36  ;    45>>55等
我进行了一些测试,但就是找不出其中的规律。

作者: 黄克帅    时间: 2012-6-11 14:57
本帖最后由 黄克帅 于 2012-6-11 14:59 编辑

左移几位 就乘以2的几次方,右移几位就除以2的几次方。
你举的几个例子,都移没了。结果都是0

作者: 邓杰    时间: 2012-6-11 15:04
class  B
{

作者: 邓杰    时间: 2012-6-11 15:05
class  B
{
public static void main(String[] args)
{
  //以下是验证代码;
  System.out.println(15>>1);
  System.out.println(15>>2);
  System.out.println(15>>3);
  System.out.println(15>>4);
  System.out.println(15>>5);
  System.out.println(15>>6);
  System.out.println(15>>7);
  System.out.println(15>>8);
  System.out.println(15>>9);
  System.out.println(15>>10);
  System.out.println(15>>20);
  System.out.println(15>>60);
}
}
/*
    0000 0000 0000 1111//15
    *000 0000 0000 0111//>>1
    -------------------------
       7
    0000 0000 0000 1111//15
    **00 0000 0000 0011//>>2
  ------------------------------
       3
    0000 0000 0000 1111//15
    ***0 0000 0000 0001//>>3
    --------------------------
       1
    0000 0000 0000 1111//15
    **** 0000 0000 0000//>>4
  -----------------------------
       0
以上是位运算的方法;*表示前面补的“0”
相信至于6>>8;     7>>12  ;  25>>36  ;    45>>55的答案你应该知道了吧;
全部是0;
*/

作者: 李海晓    时间: 2012-6-11 15:06
首先吧它换成二进制数,以6>>8为例:0000000000000110,把所有的数字向右移动8位数,低位移出,高位的空位补符号位,就是0,所以结果是0,以此类推
作者: 邓杰    时间: 2012-6-11 15:07
class  B
{
public static void main(String[] args)
{
  //以下是验证代码;
  System.out.println(15>>1);//7
  System.out.println(15>>2);//3
  System.out.println(15>>3);//1
  System.out.println(15>>4);//0
  System.out.println(15>>5);//0
  System.out.println(15>>6);//0
  System.out.println(15>>7); //0
  System.out.println(15>>8);//0
  System.out.println(15>>9);//0
  System.out.println(15>>10);//0
  System.out.println(15>>20);//0
  System.out.println(15>>60);//0
}
}
/*
    0000 0000 0000 1111//15
    *000 0000 0000 0111//>>1
    -------------------------
       7
    0000 0000 0000 1111//15
    **00 0000 0000 0011//>>2
  ------------------------------
       3
    0000 0000 0000 1111//15
    ***0 0000 0000 0001//>>3
    --------------------------
       1
    0000 0000 0000 1111//15
    **** 0000 0000 0000//>>4
  -----------------------------
       0
以上是位运算的方法;*表示前面补的“0”
相信至于6>>8;     7>>12  ;  25>>36  ;    45>>55的答案你应该知道了吧;
全部是0;
*/

作者: 宋浩    时间: 2012-6-11 15:23
左移和右移的意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余数就不要了。


作者: 李伟    时间: 2012-6-11 18:26
邓杰 发表于 2012-6-11 15:05
class  B
{
public static void main(String[] args)

我试验了一下25>>36,结果是1啊,不是0
作者: 邓杰    时间: 2012-6-11 19:02
李伟 发表于 2012-6-11 18:26
我试验了一下25>>36,结果是1啊,不是0

刚才没有说详细 是这样的一个int型的数每移32位就会回来原值;36-4=4;实际上25移了4位。所以为1啊;你可以再验证一下;
作者: 晏文根    时间: 2012-6-11 19:11
对,,你们是怎么验证的,,我怎么验证的结果都不一样,不是零呀




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2