按位运算

本文详细介绍了按位与(&)、按位或(|)、按位异或(^)、左移(<<)和右移(>>)在整数转换为二进制和进行位操作中的具体应用,包括清除位、提取部分二进制位、拼接数字以及逻辑运算与按位运算的区别。
摘要由CSDN通过智能技术生成

按位运算将整数换算成二进制数参与运算

按位与&常用作

1、让某一位或者某些位为0

例如:将0x5B = 二进制:0101 1011的最后一位化为0

十六进制:0xFE = 二进制:1111 1110

十六进制:0x5B = 二进制:0101 1011

0xFE & 0x5B = 0x5A=0101 1010    (0x5A)

               1111 1110
                            (两个位都是1的保留1否则都是0)
            &  0101 1011
            _______________
            =  0101 1010    (0x5A)
使0x5B的最后一位二进制变为0变成0x5A

2、取一个数中的某一段

例如:取十六进制:0x5AC6 = 二进制:0101 1010 1100 0110的后两断

十六进制:0x00FF = 二进制:0000 0000 1111 1111

十六进制:0x5AC6 = 二进制:0101 1010 1100 0110

0x00FF & 0x5AC6 = 0000 0000 1100 0110    (0x00C6)

                0000 0000 1111 1111
                                     (两个位都是1的保留1否则都是0)
            &   0101 1010 1100 0110
            __________________________
            =   0000 0000 1100 0110    (0x00C6)

只取0x5AC6的最后两段二进制数使其变成0x00C6

 按位或  | 常用作

1、使一位或者几位为1

例如:使0100 1010的第4位和最后一位变成1

十六进制:0x4A = 二进制:0100 1010

十六进制:0x11 = 二进制:0001 0001

0x4A | 0x11 = 0101 1011        (0x5B)

            0100 1010
        |                (有一位是1便等于1,两位都为0则是0)
            0001 0001
        ——————————————————
        =   0101 1011        (0x5B)

使0100 1010的第4位和最后一位变成1

2、把两个数拼接起来

例如:使0x00FF和0xFF00合并为一个数

十六进制:0x00FF = 二进制:0000 0000 1111 1111

十六进制:0xFF00 = 二进制:1111 1111 0000 0000

0x00FF | 0xFF00 = 1111 1111 1111 1111    (0xFFFF)


            0000 0000 1111 1111
        |                        (有一位是1便等于1,两位都为0则是0)
            
            1111 1111 0000 0000
        ————————————————————————————

        =   1111 1111 1111 1111    (0xFFFF)


使0x00FF和0xFF00合并为一个数

 3、按位取反~

常用作将数字的二进制数的0变成1,1变成0

例如:

十六进制:0x3D = 二进制0011 1101

按位取反

~0x3D = ~0011 1101 = 1100 0010    (0xC2)

         ~   0011 1101
        ——————————————————
         =   1100 0010    (0xC2)

求补码

        1 0000 0000 
    -     0011 1101
    ___________________
    
    =     1100 0011    (0xC3)

按位取反与求补码不同
按位取反是直接将是0的位数转化为1,将是1的位数转化为0
求补码是用比他溢出一位的数减去他本身

 4、按位异或 ^

二进制中如果两位相等结果是0如果不相等结果是1

对于同一个变量用同一个值异或两次等于原变量

x^y^y=x

例如:

十六进制:0x4A = 二进制:0100 1010

十六进制:0x11 = 二进制:0001 0001

0x4A ^ 0x11 = 

           0100 1010 
        ^
           0001 0001
        _________________

        =  0101 1011    (0x5B)

           0101 1011
        ^
           0001 0001
        _______________
        
        =  0100 1010    (0x4A)

对于同一个变量(0x4A=0100 1010)用同一个值(0x11=0001 0001)异或两次等于原变量

5、左移<<

i<<j是i中的所有位向左移j个位置从右边填入0

x<<1等价于x*=2

x<<n等价于x*=^{}2^{n}

十六进制:0xA5 = 二进制:1010 0101 = 十进制165

十六进制:0x294 = 二进制0010 1001 0100 = 十进制660=165*2^{2}

1010 0101 << 2

=10 1001 0100
  2   9    4

6、右移>>

i>>j是i中的所有位向右移j个位置

对于unsigned(无符号类型)左边填入0

对于signed(有符号类型)左边填入数字原来最高位,符号保持不变

x>>1等价于x/=2

x>>n等价于x/=^{}2^{n}

#include <stdio.h>
int main()
{
	int a=165;
	int b=-165;
	printf("十进制%d\n",a);
	printf("十六进制%x\n",a);
	printf("右移后十进制%d\n",a>>2);
	printf("右移后十六进制%x\n",a>>2);
	
	printf("右移后十进制%d\n",b>>2);

	printf("十进制%d\n",a);
	printf("十六进制%x\n",a);
	printf("左移后十进制%d\n",a<<2);
	printf("左移后十六进制%x\n",a<<2);
	
	return 0;
}

注:计算机内部只有按位运算没有逻辑运算

所谓的逻辑运算实际上就是把参与运算的数字的非0值全变成1然后用1参与按位运算

例如:

按位运算:5&4= 0101 & 0100 = 0100 = 4

逻辑运算:5 && 4= 1&1=1

按位运算:5 | 4= 0101 | 0100 = 0101 = 5

逻辑运算:5 || 4= 1||1=1

按位运算:~4= ~0100= 0011 = 3

(注意:只算有效值,4的二进制是0100实际有效值只有100,所以转化后是011即0011)

逻辑运算:!4= !1=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值