c语言 2.9 按位运算符(上)

目标

  • 常用位运算符的作用
  • 获取某个二进制位
  • 获取某些二进制位

按位与 & 用于屏蔽某些二进制位,即置为 0。

  10110101011
& 11111000000
= 10110000000

注意,屏蔽字的位数必须与 x 一致,否则前面会补 0。例:设屏蔽字为 1111000000。

  10110101011
& 01111000000
= 00110000000

有时候 x 的位数未知,不知道前面要补多少个 1,可以考虑用 ~ 取反。

比如使用屏蔽字 ~0b111111 将后 6 位置为 0。

    10110101011
& (~00000111111)
=   10110101011
& 	11111000000
=   10110000000

按位或 | 将某些二进制位置为 1。

  10110101011
| 11111100000
= 11111101011

按位异或 ^ 将某些二进制位取反。

  10110101011
^ 11111100000
= 01001001011

获取 x 中的某个二进制位

方法1

获取 x 的第 n 位二进制,定义最右边的一位是第 0 位,右移 n 位。

例:获取 1011110 的第 3 位,右移 3 位 => 0001011,然后按位与 1,那么只剩下第 n 位。

int getBit(int i, int n) {
  	return (i >> n) & 1;
}

方法2

屏蔽字的除了指定位为 1(可以让 1 左移 n 位),屏蔽字的其余位都为 0,也只剩下第 n 位。

例:获取 1011110 的第 3 位,1 右移 3 位 => 1000,然后按位与。

  1011110
& 0001000
= 0001000   

可以看出如果第 n 位为 0,则结果为 0;如果第 n 位为 1,则结果为 2n

int getBit(int i, int n) {
  	return i & (1 << n) == 0 ? 0 : 1;
}

获取 x 中的某些二进制位

例:获取 1011110 的第 3 ~ 5 位:011。

先右移 3 位 => 0001011,应让 011 之前的位全部置为 0,也就是原来的第 6 位到第 length-1 位置为 0,现在右移三位,于是第 6 位变成了第 3 位了。

屏蔽字为 111,即 25+1-3 - 1。但不想求幂,换一个方法。

反推导得到 111 的过程。

    000...000111
取反 111...111000
右移 111...111111
-1: 111...111111
左移:1111...1000
取反:0000...0111
int getBits(int i, int start, int end) {
  	return (i >> start) & ~(-1 << (end-start+1));
}

其中 -1 可以替换为 ~0。

我昨天似乎说了,把想要离职的意图透露给同事,我虽说不在乎,但不建议新手学我,否则第 2 天,消息就传遍整个公司,那时你就很尴尬,不走也得走。

我并不是脸皮厚,像我们这类人,不会向别人求助,能不交流就不交流,尽量避免打招呼。比如路上没有带纸、水,并不会指望能够向陌生人借到,诶,万一他也没有呢?这些事早就在出门前就应该想好,2 包纸、2 瓶水、伞,手机和现金若干,以免用完纸,店家又不接受手机支付的情况。

所以最坏情况都预料到了,无所谓别人怎么说。别人对我好,我可能很难察觉,但感知坏情绪还是挺容易的。

我接下来想做什么职业?按我目前认知来看,我都不想选择。也许我对某职业有误解,或者有未知的职业等我发掘。就这样吧。

书中例子是 p+1-n,这个很容易推导。

[start, end],数量 n = end-start+1,p = end。
则 start = p+1-n,正好 x 右移 start 位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值