位运算符 优先级 折半搜索

看编程珠玑,深知二分搜索的用处之大,自己写了一遍,竟然出了死循环。代码如下:

 1 int bsearch(int *data, int val,int left, int right)
 2 {
 3     if(left <= right)
 4     {
 5         int mid = left + (right-left)>>1;
 6         if(data[mid]==val)
 7             return mid;
 8         else if(data[mid]<val)
 9             return bsearch(data,val,mid+1,right);
10         else
11             return bsearch(data,val,left,mid-1);
12     }
13     else
14         return -1;
15 }

感觉没有特殊的地方,经过调试发现,第5行,当left = 5 ,right = 9时,mid = 5 + (9-5)>>1;结果是4 !!!!为何不是7? 运算符优先级,+号 高于 位运算符。 相当于 (5 + (9-5))>>1 ,刚好数组内data[4] < val ,造成死循环。。。

附1、折半搜索的递归和非递归实现:

 1 #include <cstdio>
 2 #include <algorithm>
 3
 4 using namespace std;
 5
 6 //递归实现
 7 int bsearch(int *data, int val,int left, int right)
 8 {
 9     if(left <= right)
10     {
11         int mid = left + ((right-left)>>1);
12         if(data[mid]==val)
13             return mid;
14         else if(data[mid]<val)
15             return bsearch(data,val,mid+1,right);
16         else
17             return bsearch(data,val,left,mid-1);
18     }
19     else
20         return -1;
21 }
22 //非递归实现
23 int bsearch2(int *data,int val,int left,int right)
24 {
25     while(left <=right)
26     {
27         int mid = left + ((right-left)>>1);
28         if(data[mid]==val)
29             return mid;
30         else if(data[mid]<val)
31             left = mid+1;
32         else
33             right = mid-1;
34     }
35     return -1;
36 }
37
38 int main()
39 {
40     int d[]={
41         5,6,7,24,698,45,698,41,547,3
42     };
43     sort(d,d+10);
44     printf("%d\n",bsearch2(d,3,0,9));//调用时,left为0,right为n-1
45
46     return 0;
47 }

附2、运算符优先级:


优先级


运算符


名称或含义


使用形式


结合方向


说明


1


[]


数组下标


数组名[常量表达式]


左到右

 

()


圆括号


(表达式)/函数名(形参表)

 

.


成员选择(对象)


对象.成员名

 

->


成员选择(指针)


对象指针->成员名

 

2


-


负号运算符


-表达式


右到左


单目运算符


(类型)


强制类型转换


(数据类型)表达式

 

++


自增运算符


++变量名/变量名++


单目运算符


--


自减运算符


--变量名/变量名--


单目运算符


*


取值运算符


*指针变量


单目运算符


&


取地址运算符


&变量名


单目运算符


!


逻辑非运算符


!表达式


单目运算符


~


按位取反运算符


~表达式


单目运算符


sizeof


长度运算符


sizeof(表达式)

 

3


/



表达式/表达式


左到右


双目运算符


*



表达式*表达式


双目运算符


%


余数(取模)


整型表达式/整型表达式


双目运算符


4


+



表达式+表达式


左到右


双目运算符


-



表达式-表达式


双目运算符


5


<<


左移


变量<<表达式


左到右


双目运算符


>>


右移


变量>>表达式


双目运算符


6


>


大于


表达式>表达式


左到右


双目运算符


>=


大于等于


表达式>=表达式


双目运算符


<


小于


表达式<表达式


双目运算符


<=


小于等于


表达式<=表达式


双目运算符


7


==


等于


表达式==表达式


左到右


双目运算符


!=


不等于


表达式!= 表达式


双目运算符


8


&


按位与


表达式&表达式


左到右


双目运算符


9


^


按位异或


表达式^表达式


左到右


双目运算符


10


|


按位或


表达式|表达式


左到右


双目运算符


11


&&


逻辑与


表达式&&表达式


左到右


双目运算符


12


||


逻辑或


表达式||表达式


左到右


双目运算符


13


?:


条件运算符


表达式1? 表达式2: 表达式3


右到左


三目运算符


14


=


赋值运算符


变量=表达式


右到左

 

/=


除后赋值


变量/=表达式

 

*=


乘后赋值


变量*=表达式

 

%=


取模后赋值


变量%=表达式

 

+=


加后赋值


变量+=表达式

 

-=


减后赋值


变量-=表达式

 

<<=


左移后赋值


变量<<=表达式

 

>>=


右移后赋值


变量>>=表达式

 

&=


按位与后赋值


变量&=表达式

 

^=


按位异或后赋值


变量^=表达式

 

|=


按位或后赋值


变量|=表达式

 

15


,


逗号运算符


表达式,表达式,…


左到右


从左向右顺序运算

上表参考:  http://www.slyar.com/blog/c-operator-priority.html

位运算符 优先级 折半搜索

时间: 2024-10-10 17:00:50

位运算符 优先级 折半搜索的相关文章

JavaScript的位运算符、赋值运算符、其他运算符、三元运算符、运算符优先级

一. 位运算符 在一般的应用中,我们基本上用不到位运算符.虽然,它比较基于底层,性能和速度会非常好,而就是因为比较底层,使用的难度也很大,底层运算是转换成二进制进行运算的. 位运算符有七种,分别是:位非 NOT(~).位与 AND(&).位或 OR(|).位异或 XOR(^).左移(<<).有符号右移(>>).无符号右移(>>>). var box = ~25; //-26 var box = 25 & 3; //1 var box = 25 |

符号(位运算符,++,--,优先级和类型转换)

位运算符:&,|,^,<<,>>,~ 都是基于二进制数的移动,其他进制都要转换成二进制进行 左移n位,相当于乘以2的n次方:右移n位,相当于除以2的n次方. ^:a^a=0,遵行交换律,结合律  a^b^a=a^a^b=b:如果a的个数为偶数,那么计算结果永远是b ++,--与逗号表达式的运算: 1 int x=3; 2 int y=(++x,x++,x+10); 逗号表达式的运算:从左到右,依次计算每个表达式的值,最后一个表达式的值就是逗号表达式的值 1 int i=3;

运算符_位运算符,其他运算符,赋值运算符,三元运算符,运算符优先级

六. 位运算符PS:在一般的应用中,我们基本上用不到位运算符.虽然,它比较基于底层,性能和速度会非常好,而就是因为比较底层,使用的难度也很大.所以,我们作为选学来对待.位运算符有七种,分别是:位非 NOT(~).位与 AND(&).位或 OR(|).位异或 XOR(^).左移(<<).有符号右移(>>).无符号右移(>>>). var box = ~25; //-26 var box = 25 & 3; //1 var box = 25 | 3;

位运算符和运算符优先级

# ###(7)位运算符: & | ~ ^ << >> var1 = 19 var2 = 15 # & 按位与 res = var1 & var2 print(res) ''' 10011 01111 00011 ''' # | 按位或 res = var1 | var2 print(res) ''' 10011 01111 11111 ''' # << 左移 """ n<<m n乘以2的m次幂 &quo

java注释 命名 数据类型 基本类型转换 位运算符 逻辑运算符 三目运算符

一.java注释 1.单行注释  //注释内容 2.多行注释 /*注释内容*/ 3.文档注释(可用javadoc工具生成api文档,不过我还没试过)/**文档注释*/,文档注释可以在使用的时候看见注释. 文档注释常用的标记 @auther作者 @version版本 @deprecated 不推荐使用 @param 本放的参数 @return 返回值 @throws异常,同@exception 二.java的命名 1.项目名 字母全部小写 2.包名 全部小写 3.类名 首字母大写加驼峰 4.方法名

黑马程序员---C基础6【#include指令】【模块化编程】【计算机的进制】【原码、反码、补码】【位运算符】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [#include指令] 1.文件包含命令的格式: 1)#include “”双引号是包含用户自己书写定义的文件(可以是头文件,也可以是普通的文件)#include是预处理指令,不是一个语句,不需要加封号 2)#include<>   包含一个系统(编译器自带)的头文件 2.文件包含的实质: 把指定文件内容插入该命令行位置取代该命令行, include不一定非要写在第一行: 3.includ

运算符优先级

1        算术运算符       单目 >双目 >三目 2        关系运算符 3        逻辑运算符      &&高于||      !算术还高高 一共有十五个优先级: 1   ()  []  .  -> 2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof 3   * / % 4   + - 5   >> << 6   > >= <

运算符优先级问题

设计一个函数计算2n+1: int func(int n) { return n << 1 + 1; } 这个函数得到的结果是4*n. 使用左移一位代替乘以2的运算,是很好的方法,但在C/C++中"+"运算符优先级高于"<<",因此会先进行加法运算再左移两位,得到结果4*n. 正确写法是: int func(int n) { return (n << 1) + 1; }

类型转换、运算符、位运算符【以及原码、反码、补码】

1.类型转换 php中的‘+’与js有区别,php中+只是算术运算符[更偏向转化为数字].js更偏向转化为字符串 php本身的自动转换类型便符合大多数对类型的处理.[也有强制转换的情形出现] [注意转换关系:字符串转换成数字类型,开头的那部分字符串能够转化为数字(还要判断浮点型和整型)] 2.转换成布尔型[实现流程控制的关键] 以下值为false: (1)布尔值为false (2)整型值为0 (3)浮点型为0.0 (4)空字符串[字符串'0'(相当于是字符串做数组时是一个空字符串),区别,注意‘