黑马程序员技术交流社区

标题: 关于位运算符号的问题 [打印本页]

作者: 聖手`书生    时间: 2013-4-2 10:33
标题: 关于位运算符号的问题
本帖最后由 聖手`书生 于 2013-4-6 18:35 编辑
  1. class ArrayTest4
  2. {
  3.         public static void main(String[] args)
  4.         {
  5. //                int[] arr = {3,2,1,5,4,2,9};
  6. //                int index = getIndex(arr,2);
  7. //                System.out.println("index="+index);

  8.                 int[] arr = {2,4,5,7,8,19,32,45};//8

  9.                 int index = getIndex_2(arr,190);
  10.                 System.out.println("index="+index);
  11.         public static int getIndex_2(int[] arr,int key)
  12.         {
  13.                 int min = 0,max = arr.length-1,mid;

  14.                 while(min<=max)
  15.                 {
  16.                         mid = (max+min)>>1;

  17.                         if(key>arr[mid])
  18.                                 min = mid + 1;
  19.                         else if(key<arr[mid])
  20.                                 max = mid - 1;
  21.                         else
  22.                                 return mid;
  23.                 }
  24.                 return min;
  25.         }
复制代码
练习:有一个有序的数组,想要将一个元素插入到该数组中,
还要保证该数组是有序的。如何获取该元素在数组中的位置。

现在就是想问大家一下,代码中的mid = (max+min)>>1;右移一位操作,怎么就是相当于(max+min)/2操作,有什么依据。
作者: 邵震    时间: 2013-4-2 10:54
本帖最后由 邵震 于 2013-4-2 10:57 编辑

因为二进制每个位数代表的数是以乘二递增的  也就是128 64 32 16 8 4 2 1

假设是8要进行>>1运算  
8的二进制表现形式是1000  对应着8001  你右移一位就是0100对应0400所以右移一位等于进行除二运算

代码一会给你

大体思路就是进行对比找到比比你要加进去的数大的那个数加在他后面 后面的数往后顺移
作者: 刘海东    时间: 2013-4-2 10:55
mid = (max+min)>>1;这个是位运算,
向右移动一位就是,右边的一位舍弃,左边补零.比如:
0000 0110       这个是6
>>1,即向右移1位,得到
0000 0011       这个是3
其实,你只要记住:
向左移n位就是乘以2的n次方;
向右移n位就是除以2的n次方;
作者: 刘胜寒    时间: 2013-4-2 11:15
二楼给你说了主要意思,其实也就那么点意思。三楼给你补充了一下。
你可以自己用代码写出了,验证一下对不对...
作者: U芽Lady    时间: 2013-4-3 12:18
mid = (max+min)>>1右移一位,右移一位不就是除于2的一次方吗,2的一次方不就是2吗,这不就等于 (max+min)/2吗
作者: lyg2013    时间: 2013-4-4 12:50
你可以看看计算机组成原理。。。上面讲的很清楚。




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