位运算符 左移及右移运算符

左移

高位丢弃,低位补0

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

int main()
{
	int i=5;
	i=i<<1;				//位运算符本身不改变i的值,必须通过赋值实现
	printf("%d\n",i);
	system("pause");
	return 0;
}

在这里插入图片描述
5的二进制为:0000 0000 0000 0101
左移后: 0000 0000 0000 1010(10)
左移可以简单理解为×2

但如果将值移成负数了就不是乘2了(实际应用中没啥意义)

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

int main()
{
	short i=0x7f89;
	printf("before i = %d\n",i);
	i=i<<1;				//位运算符本身不改变i的值,必须通过赋值实现
	printf("i = %d\n",i);
	system("pause");
	return 0;
}

在这里插入图片描述

右移

正数 低位丢弃高位补0
负数 低位丢弃高位补1

正数:
偶数除2

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

int main()
{
	int i=8;
	i=i>>1;				//位运算符本身不改变i的值,必须通过赋值实现
	printf("i = %d\n",i);
	system("pause");
	return 0;
}

在这里插入图片描述

奇数

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

int main()
{
	int i=7;
	i=i>>1;				//位运算符本身不改变i的值,必须通过赋值实现
	printf("i = %d\n",i);
	system("pause");
	return 0;
}

在这里插入图片描述
0111
0011(低位丢失了一个1)

负数

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

int main()
{
	int i=-8;
	i=i>>1;				//位运算符本身不改变i的值,必须通过赋值实现
	printf("i = %d\n",i);
	system("pause");
	return 0;
}

在这里插入图片描述
-8二进制:
0000 0000 0000 1000(取反加1)
1111 1111 1111 1000(-8右移)
1111 1111 1111 1100 (-4)

-7右移为-4(补码的原因)
所以正负奇数都可以简单记为(-1)/2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值