zoukankan      html  css  js  c++  java
  • 重拾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

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

  • 相关阅读:
    js根据年份获取某月份有几天
    java 时间转换去杠
    简单Maven Dos命令语句
    Maven命令参数
    Redis学习推荐
    Java中Redis缓存
    oracle新建登录用户sql语句
    ORacle修改表列长度
    jsp利用application统计在线人数的方法
    Oracle之分页查询
  • 原文地址:https://www.cnblogs.com/lltong/p/3375273.html
Copyright © 2011-2022 走看看