/*************************************************************************
> 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
【2015/10/25】C 学习日志_Day10 运算符
最新推荐文章于 2019-08-28 20:23:03 发布