首页 > 其他分享 >一个无符号的整数,如何翻转其二进制位?

一个无符号的整数,如何翻转其二进制位?

时间:2024-09-09 22:24:35浏览次数:11  
标签:0x0F0F0F0F 二进制位 32 reversed 整数 int 0x00FF00FF 0x33333333 翻转

方法一:可以采用下面的方法,以32位整数为例:

unsigned int v; // 32-bit word to reverse bit order

// 相邻两位互相交换
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);

// 相邻的一对互相交换
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);

// 相邻的一组(4位)互相交换
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);

// 相邻的一组(8位)互相交换
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);

// 相邻的一组(16位)互相交换
v = ( v >> 16) | ( v << 16);
// 第1步:对调相邻的1位(abcd efgh-> badc fehg)
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555)<< 1);
// 第2步:对调相邻的2位(abcd efgh-> cdab ghef)
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
// 第3步:对调相邻的4位(abcd efgh-> efgh abcd)
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
// 第4步:对调相邻的8位(相邻的字节)
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// 第5步:对调相邻的16位(相邻的两字节)
v = ( v >> 16             ) | ( v               << 16);

经过上面的步骤,一个32位整数的二进制位已经翻转了。上面的对调步骤是互不干扰的,因此顺序可以倒过来,也就是先对调相邻16位,然后是8位、4位、2位和1位。

也可以使用下面这个方法:

//也可以使用循环
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
	unsigned int a;
	scanf("%d", &a);
	unsigned int reversed_a = 0;
	for(int i = 0; i < 32; i++)
	{
		/* 左移腾出空位 */
		reversed_a = reversed_a << 1;
		/* 与上最后一位 */
		reversed_a |= (a & 0x1);
		/* 右移,将要移位的放到最后一位上 */
		a = a >> 1;
	}
	printf("%u", reversed_a);

	system("pause");
	return 0;
}

标签:0x0F0F0F0F,二进制位,32,reversed,整数,int,0x00FF00FF,0x33333333,翻转
From: https://www.cnblogs.com/tylerw/p/18405482

相关文章

  • 整数划分
    方法1:完全背包法1.状态定义:f[i][j]:表示只从1~i中选,且总体积恰好为j的方案数#include<bits/stdc++.h>usingnamespacestd;constintN=1010,MOD=1e9+7;intn;intf[N];//状态定义:f[i][j]:只从1~i中选,且总体积恰好j的集合的数量intmain(){......
  • 2529. 正整数和负整数的最大计数
    题目链接2529.正整数和负整数的最大计数思路二分法题解链接标准库调用关键点0的处理时间复杂度\(O(\logn)\)空间复杂度\(O(1)\)代码实现:classSolution:defmaximumCount(self,nums:List[int])->int:deflower_bound(val):......
  • 13_罗马数字转整数
    13_罗马数字转整数【问题描述】罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做II,即为两个并列的1。1......
  • 大整数运算
    首先是遇到了1017A除以B,稀里糊涂地复制了别人的答案就将其抛在脑后(偶然事件),紧接着就遇到了1022D进制的A+B,这时突然记起学习要有打破砂锅问到底的精神,根本不是因为发现这个问题逃避不了,开始了对这个知识点的研究学习。取余运算取余就是取模,可以将其转换为对字符串中的最低数......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • Java中的整数移位运算符
    对于<<,>>两种运算符,可以这样说:\(a<<b=a*2^b\)\(a>>b=a/2^b\)但是对于>>>...不好说了。这些位运算在计算机中怎样运算的?大家都知道,整数在计算机中是以二进制存储的:\(0=(0)_2\)\(4=(100)_2\)\(8=(1000)_2\)\(20=(10100)_2\)\(666=(1010011010)_2\)左移(<<......
  • 整数在内存中的存储(含整型提升的详解)
    整数在内存中的存储整数的2进制表示法有三种,即:原码、反码和补码有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,最高位的⼀位是被当做符号位,剩余的都是数值位。           正整数的原、反、补码都相同。      ......
  • 写一个函数判断整数在系统的储存方式为大端还是小端
    1.何为大小端。所谓大小端就是一个整形在电脑系统中以十六进制的储存方式,当一个数据超过一个字节时在内存中储存顺序会有所不同,按照不同的顺序我们分为大小端两种,大端的低字节保存在高位,小端的低字节保存在低端。例如1在系统中的储存方式有小端储存(0x00000001)   ......
  • 06 Windows批处理之整数和浮点数据类型
    在前一篇中,我们详细介绍了字符串和布尔数据类型。在本文中,我将重点讨论数值数据类型,特别是整数和浮点数据类型,详细研究它们。批处理可以轻松地处理整数,无论它们是十进制、十六进制还是八进制。然而,浮点数与布尔数类似,因为批处理实际上并不显式地支持它们作为数据类型。但是,再一次......
  • 51nod 1383 整数分解为2的幂
    整数分解为2的幂这题非常厉害,建议认真看下去虽然我讲的也不好。首先肯定先想到的是多重背包,可以把每个次幂当作物品,然后套板子。但是这题有\(O(n)\)复杂度的做法,我们想如果一个数\(i\)是奇数,那他只能由\((i-1)+1\)转化过来(2的幂次只有1是奇数),那方案数就是\(i-1\)的方案......