c/c++位操作

目录

什么是位?

位与 &

位或 |

位非 ~

异或 ^

<< 左移

>> 右移


什么是位?

内存的基本单元是字节, 一个字节有8位.

位与 &

0 & 0   0

0 & 1   0

1 & 0   0

1 & 1   1

对应位, 都是1,  结果才是1

// 00001000

// 00000011

// 00000000

cout <<  " 8 & 3 = " << (8 & 3) << endl;  

位或 |

0  |  0   0

0  |  1   1

1  |  0   1

1  |  1   1

对应位, 都是0, 结果才是0

只要有一位是1, 结果就是1

0 | x  x

// 00001000

// 00000011

// 00001011

cout <<  " 8 | 3 = " << (8 | 3) << endl;  

位非 ~

~ 1   0

~ 0   1

取反

// 00001000

// 11110111

unsigned char x = ~8;

cout << (int)x << endl;  //247

异或 ^

0 ^ 0  0

1 ^ 1  0

0 ^ 1  1

1 ^ 0  1

对应位不同, 结果才是1

// 00001000

// 00000011

// 00001011

cout << (8^3) << endl;  //11

<< 左移

右边的位用 0 来填充, 移动超出左边边界的位则直接抛弃。

向左移动 n个位置,就等同于乘以 2的n次方

只适用于: int/short/long/char 等定点数类型(float/double浮点数类型不能使用)

// 00001000

// 01000000

cout << (8<<3) << endl;   //8*2*2*2 = 64

>> 右移

如果左操作数是无符号类型,则左边多出来的位用 0 来填充。

如果左操作数是有符号类型,则左边多出来的位用 符号位(最高位) 来填充。

向左移动 n个位置,就等同于除以 2的n次方

只适用于: int/short/long/char 等定点数类型(float/double浮点数类型不能使用)

// 00001000

// 00000001

cout << (8>>3) << endl;   //1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值