c的移位操作符和位操作符
移位操作符:对二进制数进行移动
<<左移操作符:左边丢弃,右边补0
>>右移操作符:
逻辑右移:就是不考虑符号位,右移一位,左边补零即可
算术右移:需要考虑符号位,右移一位,若符号位为1,就在左边补1;否则,就补0
所以算术右移也可以进行有符号位的除法,右移n位就等于除2的n次方
左边第一位代表符号位,1代表负数,
以补码形式存放在内存中
负数:
整数的二进制表示形式:其实有三种
- 原码:直接根据数值写出二进制序列
- 反码:原码的符号位不变,其他位按位取反
- 补码:反码+1
正数,原码反码补码相同
copy
#include <stdio.h> int main() { int a =-1; //原码:10000001 //反码:11111110 //补码:11111111 int b =a>>1; //补码:11111111——>反码:111111110——>原码10000001 printf("%d ",b);//b=-1 return 0; }
位操作符
copy
int main() { /*int a = -1; int b = a >> 1; printf("%d\n", b);*/ int a = 3;//00000000 00000000 00000000 00000011 int b = 5;//00000000 00000000 00000000 00000101 int c = a & b;//00000000 00000000 00000000 000000001按(二进制)与 int d = a | b;//00000000 00000000 00000000 000000111按(二进制)或 int e = a ^ b;//00000000 00000000 00000000 000000110按(二进制)异或 //^:规则相同为零,相异为1 return 0; }
示例:不创建第三个变量,交换两个整形变量的值
copy
int main() { ////1.这种方法有弊端,当两个变量的值足够大,就会超出int的范围 int a = 3;//00000000 00000000 00000000 00000011 int b = 5;//00000000 00000000 00000000 00000101 //a = a + b; //b = a - b; //a = a - b; //2使用^ a = a ^ b;//00000000 00000000 00000000 000000110 b = a ^ b;//00000000 00000000 00000000 000000011 a = a ^ b;//00000000 00000000 00000000 000000101 printf("%d%d\n", a, b); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步