黑马程序员技术交流社区

标题: 基础练习题 [打印本页]

作者: 邝雄伟    时间: 2013-1-11 00:55
标题: 基础练习题
运行以下程序得到什么打印结果:
System.out.println(1>>>1);
System.out.println(-1>>31);
System.out.println(2>>1);
System.out.println(1<<1);

毕老师的基础视频好像没有涉及这个知识点,求分析一下,具体点
作者: 温利军    时间: 2013-1-11 02:03
做沙发{:soso_e160:}瞅瞅
作者: 郭嘉    时间: 2013-1-11 02:07
怎么会没有呢,这个在位运算操作中就涉及到了,左移<< 右移>>   注意>>和>>>的区别,前一个右移以后左边的空位是又原来数值的符号位决定,原来是正就补0,是负就补1,后面一个右移是无论左边第一位是0还是1,移动后都是补0
作者: 祝文丞    时间: 2013-1-11 02:28
System.out.println(1>>>1);打印结果为0
System.out.println(-1>>31);打印结果为-1
System.out.println(2>>1);打印结果为1
System.out.println(1<<1);打印结果为1
在教程第02天-06-进制转换(负数二进制)由提到 请注意查看。
作者: jonn    时间: 2013-1-11 03:27
典型运用的位运算操作了,实际上是计算机硬件内存条里的数据以二进制形式来运算,常常用到系统软件 ,例如windows 开机过程 ,嵌入式设备驱动程序,例如,对某个端口
寄存器中指定位进行位一级的处理,不过这针对于c的位运算,若采用java的话,只能通过JNI技术来时,调用本地c/c++动态库来实现,但这可能破坏了java跨平台的特性,尽量不要用,LZ有兴趣的话,可以OO我,最好直接去问 谷歌大神或百度 大娘 {:soso_e144:}
我这里有口诀,记得大学了老师教滴,哈哈,现在还有点影响,这里给群里黑马们透露透露
清零取法要用&,某位置一可用|
若要取反和交换,轻轻松松用^
右移“>>” ,右边的位被挤掉,对于左边空出的位,若是正数请补0,反之请补1
左移“<<” ,左边的位数被挤掉,对于右边的的位,若是正式请补1,反之请补0
特殊的运算符“>>>” 左边移动的位一律补上0
还要注意位运算的优先级~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|
这里我做个位运算的案例:
典型的物品的属性绑定,是否操作,传入限制的类型等 代码如下

/**
@version 1.0
@auther jonn
*/
public class produ
{
  /*  限制类型 :A, 不可交易;B,不可销毁;C,不可销售 ;D,不可使用虚拟币消耗 ; E, 物品锁定*/
    public static final int A=1,B=2,C=3,D=4,E=5;

  int value;

  /* 判断是否使用传入限制类型,若返回true则不能进行此类操作*/
  public boolean check(int type) {
    return (this.value&type)!=0;
   }

/* 添加绑定值*/
public void addValue(int value) {
  this.value|=value;
}

/*取消绑定值*/
public vode removeValue(int value){
this.value^=value;
  }
好累哦,白天学习,天天啃视频,晚上疯high论坛了,群里有撒疑问了给我留言,若有错误,还望l论坛里批正.....很晚了,就此搁笔了,休息去了....




作者: 曹佳佳    时间: 2013-1-11 09:07
{:soso_e179:}
作者: 高境    时间: 2013-1-11 09:18
赵文 发表于 2013-1-11 03:27
典型运用的位运算操作了,实际上是计算机硬件内存条里的数据以二进制形式来运算,常常用到系统软件 ,例如w ...

谢啦~~分享那么多
作者: 高境    时间: 2013-1-11 09:19
曹佳佳 发表于 2013-1-11 09:07

{:3_59:}{:3_50:}
作者: 丁强强    时间: 2013-1-16 12:07
这个是位运算,你在去看看教程,教程上有的,很详细
作者: Just_Only    时间: 2013-1-16 15:44
虽然已经解决  但是我想纠正下有位楼主的错误这个System.out.println(1<<1);打印的结果是2
作者: 黄金龙    时间: 2013-1-16 17:10
本帖最后由 黄金龙 于 2013-1-16 17:11 编辑
  1. class Demo12
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(1>>>1);
  6. System.out.println(-1>>31);
  7. System.out.println(2>>1);
  8. System.out.println(1<<1);
  9. }
  10. }
复制代码
(1>>>1);
0000-0000 0000-0000 0000-0000 0000-0001 二进制1
  000-0000 0000-0000 0000-0000 0000-0000 无符号右移1位. >>>是无符号位移.前面移动的补0
0000-0000 0000-0000 0000-0000 0000-0000 所以是0
(-1>>31);
1111-1111-1111-1111-1111-1111 1111-1111 二进制-1
0000-0000 0000-0000 0000-0000 0000-0001 带符号右移了31位  由于是带符号的右移因为是负数前面就要补1
1111-1111-1111-1111-1111-1111 1111-1111 所以是-1
(2>>1);
0000-0000 0000-0000 0000-0000 0000-0010   二进制2
  000-0000 0000-0000 0000-0000 0000-0001 带符号右移可1位 由于是带符号的右移因为是正数前面就要补0
0000-0000 0000-0000 0000-0000 0000-0001 所以就是1
(1<<1);
0000-0000 0000-0000 0000-0000 0000-0001 二进制1
000-0000 0000-0000 0000-0000 0000-0001   带符号左移可1位 后面补0
0000-0000 0000-0000 0000-0000 0000-0010 所以就是2



yiwei.jpg (1.51 KB, 下载次数: 78)

yiwei.jpg

作者: yong230    时间: 2013-1-16 17:20
这个涉及到位移运算




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