【C语言】移位操作符和位操作符-创新互联
- 前言
- 整数在内存中的存储
- 原码·反码·补码
- 移位操作符
- 左移操作符
- 右移操作符
- 位操作符
- 按位与(&)
- 按位或( | )
- 按位异或( ^ )
位操作符和移位操作符都是针对于二进制进行操作的
整数在内存中的存储整数在内存中储存的是他的二进制补码
整数(int)在内存空间中占四个字节
正数原码反码补码相同
负数反码等于源码处符号位其余为取反
补码等于补码+1
移位操作符例如10的二进制序列为1010
补码和原码相同 即
00000000 00000000 00000000 00001010
例如-10的二进制序列为
10000000 00000000 00000000 00001010
反码为
11111111 11111111 11111111 11110101
补码为
11111111 11111111 11111111 11110110
移位操作符包括
左移操作符:<<
右移操作符:>>
注意移位操作符的对象必须是整数
左移操作符的规则是左边丢弃,右边补0
例如10左移两位
先写出10的二进制序列
00000000 00000000 00000000 00001010
补码是
00000000 00000000 00000000 00001010
左移两位右边补0后
00000000 00000000 00000000 00101000
用十进制表示就是40
#includeint main()
{int b = 10<< 2;
printf("%d",b);
return 0;
}
右移操作符右移操作符分为两种,算术右移和逻辑右移
算术右移是右边丢弃,左边补原来的符号位
逻辑右移是右边丢弃,左边补零
C语言中位操作符有按位与 按位或 按位异或
他们的操作数是整数 ,对象是整数的二进制序列
运算编码:补码
将整数从十进制转化为二进制数,上下比较,有零则零 ,两个都是 1 才是 1。
例如10&15
10的二进制序列为00000000 00000000 00000000 00001010
15的二进制序列为00000000 00000000 00000000 00001111
他们都是正数,原码反码补码都相同,所以直接上下比较
得到 00000000 00000000 00000000 00001010 十进制为10
#includeint main()
{int a = 10, b = 15;
printf("%d", (a & b));
return 0;
}
例如-10和-15
-10原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
补码11111111 11111111 11111111 11110110
-15原码10000000 00000000 00000000 00001111
反码 11111111 11111111 11111111 11110000
补码 11111111 11111111 11111111 11110001
上下比较得到 11111111 11111111 11111111 11110000
转化为原码是 10000000 00000000 00000000 00010000
转化为十进制数是-16
#includeint main()
{int a = -10, b = -15;
printf("%d", (a & b));
return 0;
}
按位或( | )运算编码:补码
将整数从十进制转化为二进制数,上下比较,有1则1 ,两个都是 0 才是 0。
例如10 | 15
10的二进制序列为00000000 00000000 00000000 00001010
15的二进制序列为00000000 00000000 00000000 00001111
他们都是正数,原码反码补码都相同,所以直接上下比较
得到 00000000 00000000 00000000 00001111
十进制为15
#includeint main()
{int a = 10, b = 15;
printf("%d", (a | b));
return 0;
}
例如-10和-15
-10原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
补码11111111 11111111 11111111 11110110
-15原码10000000 00000000 00000000 00001111
反码 11111111 11111111 11111111 11110000
补码 11111111 11111111 11111111 11110001
上下比较得到 11111111 11111111 11111111 11110111
转化为原码是 10000000 00000000 00000000 00001001
转化为十进制数是-9
#includeint main()
{int a = -10, b = -15;
printf("%d", (a | b));
return 0;
}
按位异或( ^ )运算编码:补码
将整数从十进制转化为二进制数,上下比较,上下比较,相同为 0 ,相异为 1
例如0 ^ 15
10的二进制序列为00000000 00000000 00000000 00001010
15的二进制序列为00000000 00000000 00000000 00001111
他们都是正数,原码反码补码都相同,所以直接上下比较
得到 00000000 00000000 00000000 00000101
十进制为5
#includeint main()
{int a = 10, b = 15;
printf("%d", (a ^ b));
return 0;
}
例如-10和-15
-10原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
补码11111111 11111111 11111111 11110110
-15原码10000000 00000000 00000000 00001111
反码 11111111 11111111 11111111 11110000
补码 11111111 11111111 11111111 11110001
上下比较得到 00000000 00000000 00000000 00000111
转化为原码是 00000000 00000000 00000000 00000111
转化为十进制数是7
#includeint main()
{int a = -10, b = -15;
printf("%d", (a ^ b));
return 0;
}
希望我的博客对你的学习有帮助
IDE VS2022
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:【C语言】移位操作符和位操作符-创新互联
文章链接:http://myzitong.com/article/dcggdp.html