神奇的位运算

来源:互联网 发布:uboot源码下载 编辑:程序博客网 时间:2024/05/27 14:14

~:各位取反运算

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

  • 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;
0 0
原创粉丝点击