按位运算符,用于简单地翻转整数中的所有位?

我必须翻转整数的二进制表示中的所有位。鉴于:

10101

输出应为

01010

与整数一起使用时,实现此目的的按位运算符是什么?例如,如果我正在编写一个像 ,正文中会有什么?我只需要翻转数字中已经存在的内容,而不是整数中的所有32位。int flipBits(int n);


答案 1

一元运算符是按位否定。如果您需要的位数少于适合的位,那么您需要在事后掩盖它。~int&


答案 2

只需使用按位非运算符。~

int flipBits(int n) {
    return ~n;
}

要使用 k 个最低有效位,请将其转换为正确的掩码。
(我假设你至少想要1位,这就是为什么掩码从1开始)

int flipBits(int n, int k) {
    int mask = 1;
    for (int i = 1; i < k; ++i)
        mask |= mask << 1;

    return ~n & mask;
}

正如Lưu Vĩnh Phúc所建议的那样,人们可以创建面具而不是使用循环。(1 << k) - 1

int flipBits2(int n, int k) {
    int mask = (1 << k) - 1;
    return ~n & mask;
}

推荐