翻转无符号整型数据的比特位

【问题:给定无符号整型数据,需要你翻转它的比特位(依中心镜像翻转)】

这个问题有很多解决方法,这里介绍利用异或(xor)运算解决这个问题的小技巧。

提示:怎样交换第i位比特和第j位比特数据呢?试着想想怎样用异或(xor)运算实现。

异或运算技巧:

实现翻转我们需要将这个数据的前n/2(假设数据有效位数为n,二进制)有效位和后n/2有效位进行交换。写一个函数swapBits(i, j),用来交换第i位和第j位bit。

复习一下异或运算:

0 ^ 0 == 0
1 ^ 1 == 0
0 ^ 1 == 1
1 ^ 0 == 1.

只有当i位和j位bit不同时才需要交换。测试两个bit是否相同就用到了异或运算,如果不同,将两个比特同时取反就行了,这里又可以运用xor运算。代码如下:

typedef unsigned int uint;
uint swapBits(uint x, uint i, uint j)
{
    uint lo = ((x >> i) & 1);
    uint hi = ((x >> j) & 1);
    if (lo ^ hi)
    {
        x ^= ((1U << i) | (1U << j));
    }
    return x;
}

uint reverseXor(uint x)
{
    uint n = sizeof(x) * 8;
    for (uint i = 0; i < n/2; i++)
    {
        x = swapBits(x, i, n-i-1);
    }
    return x;
}
时间: 2024-11-05 14:39:23

翻转无符号整型数据的比特位的相关文章

关于无符号整型数中1的个数与0的个数的改变与计算引发的思考

首先可以把unsigned int数中的1的个数与0的个数改变与计算的实现: </pre><pre name="code" class="cpp">/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 *

v.size() return size_t not int 返回无符号整型数

In the C++ STL, the vector size() function return size_t, which is unsigned int, not int. So imagine this, define an empty vector<int> v, and v.size() should be 0, and you have a for loop, and has an end condition is v.size() - 1, which is 429496729

有符号和无符号整型数字

8位无符号整型:0 -> 25511111111     255...10000000     12801111111     127...00000000       0 8位有符号整型:-128 -> 12701111111    127...00000000      011111111     -1        取反加一...10000000   -128        取反加一

[C/C++]如何将一个无符号整型所有数据位置为1

正解「x = -1;」 -1超出无符号整型x的表达范围,根据标准(C++11 section 4.7.2),-1将被转化为2^n-1(n为x的bit数). 不正解 「x = 0xFFFFFFFF;」 这只适用于32bit整型. 不正解「x = ~0;」 这个被很多书认定为「标准答案」的解答也是错的.C/C++标准支持原码/反码/补码三种负数表示形式,只有在补码环境下才会得到正确结果.(例如在反码下,~0将得到-0,-0转为无符号仍然是0) 那么x = ~0u呢? 仍然是错的.根据标准(C++11

uint8是8位无符号整型,uint16是16位无符号整型。

整型有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned.在一些不可能取值为负数的时候,可以定义为unsigned,在一些底层的嵌入式编程的数据一般都是无符号. 向左转|向右转 扩展资料: 负数时的有符号整型和无符号整型的转换 当执行一个运算时(如这里的a>b),如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号 参数强制类型为无符号数,并

【C语言位运算的应用】如何按bit位翻转一个无符号整型

其实现思路如下: 将目标数值进行末尾比特位摘取,将所摘取的bit位放到一个相同类型的末尾,目标数值bit位右移,相同类型bit位左移. C语言的位运算符:     实现代码如下: #include <stdio.h>//按位翻转一个无符号整形 unsigned int reverse_bit(unsigned int value) { unsigned int num = 0; int i = 0; for (i = 1; i < 32; i++) { num += value &

无符号整型指定比特位置1

将无符号数的指定比特进行置1.输入数字n(31bit,无符号整形),置为数m(0<=m<=31). 输入:无符号数,指定bit位 输出:指定的bit位被置1的值 例如:输入 891 7 输出 1019 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main(void) 4 { 5 unsigned int c, tmp; 6 int d; 7 while (1) 8 { 9 scanf("%d%d"

无符号整型与有符号整型相运算规则

有符号数和无符号数运算的时候,有符号数会自动向无符号数转换 1 #include<iostream> 2 #include<ctime> 3 #include <stdio.h> 4 #include<cstring> 5 #include<cstdlib> 6 #include <map> 7 #include <string> 8 using namespace std; 9 10 #if TEST 11 int ma

无符号整型unsigned int、unsigned long、usigned long long、size_t比较和格式控制

位数比较 由于数据的长度和平台相关,所以基于 64 位系统比较. Windows Linux unsigned int 32 bits/4294967295 32 bits unsigned long 32 bits 64 bits/18446744073709551615 unsigned long long 64 bits 64 bits size_t 32 bits 64 bits 可以看到,size_t 和 unsigned long 比较同步.另外 ssize_t 和 size_t 的