【2015/10/25】C 学习日志_Day10 运算符

/*************************************************************************
    > File Name: clac_symbol.c
    > Author: khalil
    > Mail: hsgwpj@gmail.com
    > Created Time: Sun 25 Oct 2015 02:44:14 PM CST
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//作业:统计1的个数 并打印位表示方式
    // 80 / 9   的位表示形式?
#if 0
//算术运算

int main ( int argc ,char ** argv )
{
    // + - * /  (适用于整形和浮点)
    //
    //%         (只适用于整形,浮点不可以)
    int a = 10;
    int b = 20;
    float c = 0.5;

    b %= -6;    //结果只和被取余的对象的正负决定
                //b == 2


    return 0;
}

#endif

#if 0
int main (int argc , char ** argv)
{
    int a = 4;
    int b = 7;

    a <<= 1;        //左移位 ==> a * 2
    b >>= 1;        //右移位 ==> b / 2 =3
    //0000 0111 ----> 0000 0011
    //7 / 2 = 3

    // 80 / 9   的位表示形式?
    //
    // 乘法和除法可以通过移位来表示
    //
    char c =  -10;
    // -10 = 0 -10 = 1111 0101 = 0xF5
    //
    c >>= 2;
    // 右移位的时候补位一直补的是符号位
    // 1111 0101  --> 1111 1101
    //
    // signed 类型右移补充的位是符号位,如果为1,左边补1
    // unsigned 类型
    //
    unsigned char d = 150;
    // 150 = 128 + 16 + 4 + 2 = 1001 0110

    d >>= 1;
    // 0100 1011 or 1100 1011?
    printf("%u\n",d);   //75 -> 01001011

    //unsigned类型右移补充 0


    printf("%d",c);
    return 0;
}
#endif

#if 0
int main (int argc , char ** arhv)
{
    int a = 10;
    a >>= 32;
    printf("%d\n",a);
    //不会移动
    //
    //移位操作符会进行长度判断,判断失败不执行
    //
    a >>= 31;
    printf("%d\n",a);
}
#endif

#if 0

void swap (int * , int *);

void swap ( int *a ,int *b )
{
    //传址调用!
    //传值调用是不会改变原值的!
    int temp = *a;
    *a = *b;
    *b = temp;
}

void swap_xor( int *a , int *b );

void swap_xor( int *a , int *b )
{
    if( a != b)
    //如果传的址是同一个 会导致出错
    //eg: swap_xor(&a,&a)
    //      a = 0;
    {
       *a ^= *b;
       *b ^= *a;
       *a ^= *b;
    }
}

void swap_and( int *a , int *b );

void swap_and( int *a , int *b )
{
    //哪怕int溢出也可以 加减操作是可逆的
    if ( a != b )
    {
        *a = *a + *b;
        *b = *a - *b;
        *a = *a - *b;
    }
}

void swap_sub(int *a, int *b);

void swap_sub(int *a, int *b)
{
    *a = *b - *a;
    *b = *b - *a;
    *a = *a + *b;
}
泛型编程!/
void swap_void(void *a, void *b , int length);

void swap_void(void *a, void *b , int length)
{
    void *temp = malloc(length);
    memcpy(temp , a, length);
    memcpy(a , b, length);
    memcpy(b , temp, length);
    free(temp);         //防止内存泄露!
}

int main (int argc , char **argv)
{
    int a = 10;
    int b = 20;
    //使用异或不引入新的变量进行值的交换
    a ^= b;
    b ^= a;
    a ^= b;

    printf("^   :a = %d, b = %d\n",a,b);
    swap_void(&a,&b,sizeof(int));
    printf("swap:a = %d, b = %d\n",a,b);

    return 0 ;
}
#endif


#if 1

int get_one_count(int value);

int get_one_count(int value)
{
    int count = 0;
    int temp = value;
    int sub = 0;
    int *result = (int*)malloc(sizeof(int)*128);
    *result = '\0';
    result++;

    for( ; 0 != temp ; temp >>= 1){
        sub = temp % 2;
        printf("sub = %d\n",sub);
        *result++ = sub;
        printf("*result = %d\n",*result);
        if( 1 == sub){
            count++;
        }
    }
    while(*result != '\0'){
         printf("%d",*result--);
    }
    return count;
}

int main(int argc ,char ** argv)
{
    int a =7;
    int b =20;
    int count = 0;
    //a &= b    //0000 1010 a
    //          //0001 0100 b
    //          //0000 0000 a &= b

    //a |= b    //0000 1010 a
    //          //0001 0100 b
    //          //0001 1110 a |= b
    //布尔代数
    //
    //
    //  给定一个 signed int 类型,判断其中1的位数
    count = get_one_count(a);
    printf("%d的位表示中有%d个1",a,count);

    return 0;
}


#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值