左移和右移运算符(操作数是右边设定的要移动的位数),不应用于负数。
1) 左移运算符(<<)
- 作用:用来将一个数的二进制位左移若干位,移动的位数由操作数决定(操作数必须为非负值),其右边空出来的位用0补上;
高位左移溢出的舍弃该高位;
例如:
unsigned char a =6;//a=6(00000110)
printf( "a<<1 = %d\r\n , a<<);//(00001100)
则a<< = 12;
2) 右移运算符(>>)
- 作用:用来将一个数的二进制位右移若干位,移动的位数由操作数决定(操作数必须为非负值),移到右边的低位被舍弃,对于无符号的
高位补0;对于有符号的,有些计算机系统会用1来填补(即算数移位),有些则用0填补(逻辑移位)。
例如:
unsigned char a =6;//a=6(00000110)
printf( "a>>1 = %d\r\n , a>>);//(00000011)
则a>> = 3;
3)左右移和2的关系
- a <<3= a*pow(2,3) a>>3 =a/pow(2,3) 注意:逻辑移位和算数移位的区别
逻辑移位是将移出去的位丢弃,空缺位用0填补;
算数移位也是将移出去的位丢弃,空缺位用1填补,一般用于右移位;
//x的n次方函数计算(有个上限值和一个下限值,定义上限值是Max,下限值是1)pow函数
#define Max 1000
void x_y_value(unsigned short*y, unsigned short*times)
{
//定义局部变量
static unsigned short temp_z =0;
volatile float x = 0;
volatile float n = 1.5;
if(*y > Max)
{
*y = Max;
}
x = (float)*y / Max;
*y = powf(temp,n)* Max; ///powf(x,n)x的n次方
if(*time < 1)
{
*time++;
temp_z = *y;
}
else
{
*y = (*y >>1) + (temp_z >>1);
}
if(*y >= Max)
{
*y = Max + 1;
}
else if (*y <1)
{
*y = 1;
}
else
{
*y = *y;
}
}
- 小金蛋时刻:I’m just afraid that if I died today, that my life would’ve
amounted to nothing.
(我只是怕某天死了,我的生命却一无所有。)
logic shift:逻辑移位; atithmatic shift:算数移位; vacant bit: 空缺位。 每天进步一点点。。