按位运算
C语言提供了6个位操作运算符,只能作用于整型操作数,即只作用于带符号或无符号的char、short、int、long。
& 按位与(AND)
! 按位或(OR)
^ 按位异或(XOR)
<< 左移
>> 右移
~ 按位求反(一元运算符)
按位与运算符&经常用于屏蔽某些二进制位,例如:
n = n & 01777
按位异或:当两个操作数的对应位不同时将该位设置为1,否则为0。
int x = 1;
int y = 2;
x & y; //0
x && y ; //1
x 0000 0001
&
y 0000 0010
= 0000 0000
左移右移:移动的位数由右操作数指定(右操作数的值必须是非负值)。
x<<2把x的值左移2位,右边空出的2位补0。
x = 1; 0000 0001
x << 2 => 00 000100 => 4 <=>等价对左操作数乘以4
对unsigned类型的无符号值右移时,左边空出的部分补0;对signed类型的带符号值进行右移时,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分补0(即“逻辑移位”)。
一元运算符~用于求整数的二进制反码,即分别将操作数各二进制位上的1变0,0变1。
x = 1;
x = x & ~077=>1 & ~(1001101) => 1 & 0110010 => 0000001 & 0110010 => 0
以下函数暂时没搞懂
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 unsigned getbits(unsigned x, int p, int n); 3 main(){ 4 int x = 123456789,y = 5, z = 2; 5 int i = getbits(x,y,z); 6 printf("%d ",i); 7 return 0; 8 } 9 /**********返回x中从第p位开始的n位**********/ 10 unsigned getbits(unsigned x, int p, int n){ 11 return (x >> (p+1-n)) & ~(~0 << n); 12 }
赋值运算符和表达式
i = i +2;
i += 2;
expr1 op = expr2; <=> (expr1) = expr1 op (expr2)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 int bitcount(unsigned x); 3 main(){ 4 printf("%d ",bitcount(234561789)); //c-free运行结果为18 5 return 0; 6 } 7 /**********统计x中值为1的二进制位数**********/ 8 int bitcount(unsigned x){ 9 /*这里将x定义为unsigned类型为了保证将x右移时,无论程序在什么机器上运行,左边空出位都将补0,而不是符号位。 */ 10 int b; 11 for(b=0; x!=0; x>>=1){ 12 if(x & 01){ 13 b++; 14 } 15 } 16 return b; 17 }
条件表达式
if(a > b)
z = a;
else
z = b;
z = a > b ? a : b;
; 语句结束符号
{} 程序块
if-else
if(表达式)
语句
if(表达式)
语句
else
语句
if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else
语句
为避免嵌套出错,尽量用{}括起来,也方便阅读。如下:
if(){
….
}else{
….
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 int binsearch(int x, int v[], int n); 3 main(){ 4 int arr[] = {1,2,3,4,5,6,7,8,9}; 5 printf("%d ",binsearch(7,arr,9)); //6 6 return 0; 7 } 8 9 int binsearch(int x, int v[], int n){ 10 int low,high,mid; 11 low = 0; 12 high = n - 1; 13 while(low <= high){ 14 mid = (low + high) / 2; 15 if(x < v[mid]) { 16 high = mid - 1; 17 }else if(x > v[mid]){ 18 low = mid + 1; 19 }else{ 20 return mid; 21 } 22 } 23 }
看到这些涉及到算法的代码,好多不太理解,加油自己!