重拾C,一天一点点_3

按位运算

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

以下函数暂时没搞懂

 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  }
View Code

赋值运算符和表达式

i = i +2;

i += 2;

expr1 op = expr2;   <=> (expr1) = expr1 op (expr2)

 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  }
View Code

 条件表达式
    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{
      ….
  }

 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 }
View Code

看到这些涉及到算法的代码,好多不太理解,加油自己!

原文地址:https://www.cnblogs.com/lltong/p/3375273.html