C语言入门07 位运算

本文介绍了位运算的基本规则,包括按位与、按位或、按位取反和异或,以及左位移和右位移的区别,特别是提到了在VS2019编译器中,右移操作采用的是算数位移。通过具体的C语言代码示例,展示了这些位运算在正数和负数上的应用效果。
摘要由CSDN通过智能技术生成

概述

需要了解位运算,只需要明白,无论是正数还是负数,编译系统都是按照内存中存储的内容进行位运算,因此不要管什么符号位不符号位的,全都参与运算。

  • 按位与 &:全1为1
  • 按位或 |:有1为1
  • 按位取反 ~:1变0,0变1
  • 异或 ^ :相异得1,相同得0
  • 左位移 << :高位溢出,低位补0
  • 右位移 >> :1. 逻辑右移: 不管是否有符号位,都是高位补0,低位溢出。2.算数右移:对有符号数来说,低位溢出,高位补符号位;对无符号位来说,高位补0,低位溢出。有位移是逻辑位移还是算数位移取决于编译器。

举例

#include<stdio.h>
int main() {
	//测试
	printf("%d\n", -5 & 10);//结果是10
	printf("%d\n", -5 | 10);//结果是-5
	printf("%d\n", ~-5);//结果是-5
	printf("%x\n", -5 ^ 10);//结果是1
	printf("%d\n", (-1) >> 3);//结果是-1
	
}
/*

* -5 & 10
   1111 1111 1111 1111 1111 1111 1111 1011  -5的补码
 & 0000 0000 0000 0000 0000 0000 0000 1010  10的补码
   ---------------------------------------
   0000 0000 0000 0000 0000 0000 0000 1010  结果--》10

* -5 | 10
   1111 1111 1111 1111 1111 1111 1111 1011  -5的补码
 | 0000 0000 0000 0000 0000 0000 0000 1010  10的补码
   ---------------------------------------
   1111 1111 1111 1111 1111 1111 1111 1011  结果--》-5

* ~-5
   1111 1111 1111 1111 1111 1111 1111 1011
   ---------------------------------------
   0000 0000 0000 0000 0000 0000 0000 0100  结果--》4

* -5 ^ 10
   1111 1111 1111 1111 1111 1111 1111 1011  -5的补码
 ^ 0000 0000 0000 0000 0000 0000 0000 1010  10的补码
   ---------------------------------------
   1111 1111 1111 1111 1111 1111 1111 0001  结果--》fffffff1

* -1 >> 3
   1111 1111 1111 1111 1111 1111 1111 1111  -1的补码
   ---------------------------------------
   1111 1111 1111 1111 1111 1111 1111 1111  结果是--》-1
*/

通过右移的测试,我使用的VS2019自带的编译器使用的是算数位移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值