C基础——位运算符的使用

  • 位运算符的介绍

首先介绍一下“位”,

数值或字符在内存内都是被存储为0和1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内被存储为 0 0 0 0 0 0 1 0(此处以一字节为例),当我们将内存内的位值改变之后,这个值代表的意义也就变了,比如把2前移动一位, 现在存储单元里面变成了0 0 0 0 0 1 0 0,这个值表示的是十进制的4,这也就是按位操作符的运算原理。

& :位与

运算法则:

全1则1,有0则0。

| :位或

运算法则:

有1则1,全0则0。

~ :按位取反

运算法则:

1取反得0,0取反得1

^ : 按位异或

运算法则:

相同为0,不同为1

<< : 按位左移

左移几位,右边补几个0

>>: 按位右移

右移几位,左边补几位符号位

  • 位与运算

0xab & 0x3c

1010 1011

& 0011 1100 (ab与3c进行与运算,全1则1,有0则0。)

= 0010 1000

= 0x28

  • 位或运算

0xab | 0x3c

1010 1011

| 0011 1100 (ab与3c进行或运算,有1则1,全0则0。)

= 1011 1111

= 0xbf

  • ~ :按位取反运算

~ 0x3c

0011 1100

~=1100 0011 (按位取反)

= 0xc3

~60

正数原码 0011 1100

正数补码 0011 1100

~= 1100 0011

负数补码 1100 0011

负数原码 1011 1101 (负数补码转原码,符号位不变,末位加1)

=- 61

~(-25)

负数原码 1001 1001

负数补码 1110 0111 (负数补码转原码,符号位不变,末位加1)

~= 0001 1000

正数补码 0001 1000

正数原码 0001 1000 (正数补码转原码)

= 24

~x = -(x+1)

  • ^ : 按位异或运算

0xab ^ 0x3c

1010 1011

^ 0011 1100 (相同为0,不同为1)

= 1001 0111

= 0x97

  • << : 按位左移运算

运算公式(有条件)

x << n = x * 2^n

10 << 2 = 40

25 << 2 = 100

8 << 3 = 64

-12 << 3 =

负数原码 1000 1100

负数补码 1111 0100

<< 3 1010 0000 (数往左已,多位补0)

负数补码 1010 0000

负数原码 1110 0000

= 96

  • >>: 按位右移运算

运算公式(有条件)

x >> n = x / 2^n

32 >> 2 = 8

48 >> 2 = 12

- 48 >> 2 = -12

负数原码 1011 0000

负数补码 1101 0000

>>2 1111 0100 (右移一位补一位符号位)

负数补码 1111 0100

负数原码 1000 1100

= -12

-50 >> 2 = -13 -50 / 4 = -12 -50 >> 2 = -50 / 4 = -13

负数原码 1011 0010

负数补码 1100 1110

>>2 1111 0011

负数补码 1111 0011

负数原码 1000 1101

= -13

  • 置位问题

例1:

将num的第四位置1

num = 0xab

1010 1011

| 0001 0000

1011 1011

num = num | (1<<4)

例2:

将num的第五位置0

num = 0xab

1010 1011

& 1101 1111

1000 1011

num = num & ~(1<<5)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值