神奇的位运算

125 篇文章 7 订阅
51 篇文章 0 订阅

~:各位取反运算

首先需要明确的一点:计算机存储的是二进制,是补码。~(取反运算)针对的便是补码,而且是对全部的二进制位进行取反,不论是否为符号位。

  • 5 的补码:整数的补码,仍然为其自身,0000 0101,

    ~5
    (1)各位取反,1111 1111 1111 1010
    (2)将其转换为源码,即-1,再取反(符号位除外),1000 0000 0000 0110 ⇒ -6

  • -5 的补码,

    1000 0000 0000 0101 ⇒ 1111 1111 1111 1010(各位取反) ⇒ 1111 1111 1111 1011(再加1)
    ~(-5):
    (1)对其补码取反(全部位),⇒ 0000 0000 0000 0100 ⇒ 4

获取一个数的符号位

x >> 31 & 0x01;
                // x 为 int(32位机)型整数

不使用”-“号,实现取负

~x+1;
                // 无论正负

实现 abs(求绝对值)

x >> 31 & 0x01 ? ~x+1 : x ;
                        // 正数的绝对值是其自身
                        // 负数的绝对值是其反

判断二进制位形式中1的个数

int numOf1(int x)
{
    int cnt = 0;
    while (x)
    {
        ++cnt;
        x &= (x-1);
    }
    return cnt;
}

二进制形式中最右为1所在的位置

比如 1100 ⇒ 4, 1110 ⇒ 2,1000 ⇒ 8

(x ^ (x-1)) & x

实现对一个数二进制形式的截断

实现对一个数二进制形式的截断,使其为 2^n 的倍数;

uchar mask = 0xff << n;
x &= mask;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值