#ifndef _726____________h
#define _726____________h
#endif
//********************************************************************
********************************************
运算符:用来连接操作数,组成有意义的式子
分类:算数运算符 关系运算符 逻辑运算符 位运算符
//********************************************************************
****************************************************************
位运算符 :用于整数的二进制为之间的运算
& | ^ ~
//********************************************************************
********************************************************************
& 按位与:如果两个位进行&操作 同1结果则为1 ,有0结果就为0
// 9&8
// 00000000000000000000000000001001
// & 00000000000000000000000000001000
// -----------------------------------------
// 00000000000000000000000000001000 即是10进制的8
//********************************************************************
********************************************************************
| 按位或:如果两个位进行|操作,有1则结果为1,同0结果就为0
// 00000000000000000000000000001001
// &00000000000000000000000000001000
//------------------------------------------
// 00000000000000000000000000001001 9
//********************************************************************
********************************************************************
~ 按位取反:1变0 ,0变1
//~9;
//00000000000000000000000000001001
//~
//-----------------------------------
//11111111111111111111111111110110 补
补码-->原 :符号位不变,取反+1
//10000000000000000000000000001001 反
//10000000000000000000000000001010 原 -10
//********************************************************************
********************************************************************
^ 按位异或:相同为0,不同为1
9^8
// 00000000000000000000000000001001
//^ 00000000000000000000000000001000
//------------------------------------------
// 00000000000000000000000000000001
//********************************************************************
********************************************************************
>> 右移位
//8>>2 == 2
一个数右移n位,值等于 原值 除以 2^n,结果是整数部分
右移位,移出去的部分要舍弃
高位要补符号位
000000000000000000000000000010
|
右移位,不会改变一个数的正负性
//********************************************************************
********************************************************************
<< 左移位
左侧、高位移动出去的位就丢了
低位开始补0
//8<<2 == 32
记忆的技巧:向左移动n位,相当于原数*2^n
00000000000000000000000000100000
|
致命问题
-1073741823
11000000000000000000000000000001;
|
00000000000000000000000000000100;
注意:左移可能会改变一个数的正负性
//*************************************************************
***************************************************************
左移位右移位总结
/* 00001000
>> 00000010
<< 00100000
*/
//实用技能:
//1)获取一个数的最低位 让这个数和1进行按位&操作
//...... 00000110
//...... 00000001
//*************************************************************
***************************************************************
数组指针预习
-------------------------->>>>>>>>>>>>>------------------------
数组指针:
指向数组元素的指针
数组指针的作用:
使用数组指针间接访问数组的元素
数组指针的定义:
int *p;
数组指针的初始化:
int a[4]={1,2,3,4};
int *p = a; //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素
int *p = &a[0]; //等价上面一句话
数组指针如何访问数组的元素:
1)p+1 表示指向数组的下一个元素
2)p-1 指向数组的上一个元素
-------------------------->>>>>>>>>>>>>------------------------
代码验证如下
int a[4]={8,5,1,24};
int *p=a;
printf("a+1=%p\n",a+1);//a+1=0x7fff5fbff814
printf("&a[1]=%p\n",&a[1]);//&a[1]=0x7fff5fbff814
printf("p+1=%p\n",p+1);//p+1=0x7fff5fbff814
printf("*p+1=%d\n",*p+1);//*p+1=9 是*p所指向的对象的值再加1
printf("*(p+1)=%d\n",*(p+1));//*(p+1)=5
printf("*p=%d\n",*p);//*p=8
printf("*p++=%d\n",*p++);//是位置自增 指向下一个位置 *p++=8
//但当下取出的值还是*p所指向的内容
printf("*p++=%d\n",*p++);//*p++=5
printf("*p++=%d\n",*p++);//*p++=1
printf("*p++=%d\n",*p++);//*p++=24
printf("*(a+1)=%d\n",*(a+1));//*(a+1)=5
printf("*a=%d\n",*a); //*a=8
-------------------------->>>>>>>>>>>>>------------------------
预习数组指针后的总结
对于一个一维数组来说
int a[5];
1)获取 a[i]的地址有几种方法?
(1)&a[i]
(2)a+i
(3) int *p = a;
p+i
2) 获取 a[i]的值有几种方法?
(1)a[i]
(2)*(a+i)
(3) int *p = a;
*(p+i)
(4)*(&a[i])
-------------------------->>>>>>>>>>>>>------------------------
|
|