(转贴)反转一个字节 和 判断32位整数二进制中1的个数 的算法

数的反转——算法 数的反转 问题描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231−2^{31}−231, 231−12^{31} − 1231−1]。请根据这个假设,... 阅读详情

unsigned char reverse8( unsigned char c )
{
    c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1;
    c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
    c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
    return c;
}

unsigned long func(unsigned long x)
{
    x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);
    x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
    x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL);
    x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL);
    x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL);
    return x;
}

先看问题1: 反转一个字节。
它的算法是这样的: 首先是2位2位为一组,交换前一半和后一半。再4位4位为一组,交换前一半和后一半。再8位为一组,交换前一半和后一半

。
可能还有点说不清楚。我举个例子。
将1 2 3 4 5 6 7 8 反转。
(1)2个2个为一组,交换前一半和后一半, 变成。
  2 1 4 3 6 5 8 7
(2)4个4个为一组,交换前一半和后一半, 变成
  4 3 2 1 8 7 6 5
(3)再8个为一组,交换前一半和后一半, 变成
  8 7 6 5 4 3 2 1
反转成功。
这样的算法本来很是简单,很容易用数学归纳法证明其正确。这函数, 巧妙就巧妙在作了并行计算,分组,它一次就计算完了。

先看第一个语句。c = ( c & 0x55) << 1 | ( c & 0xAA ) >> 1; 
0x55其实就是01010101, 0xAA就是10101010
假设 c=abcdefgh
c & 0x55 = 0b0d0f0h,    c & 0xAA = a0c0e0g0
跟着,前者左移一位, b0d0f0h0, 后者右移一位, 0a0c0e0g, 再一个|运算,就两位两位交换了位置。
想象一下,你有一个长纸条,分成一格一格,每格写一个字,假如你将纸条每隔一格剪一个小洞,滑一格,覆盖在原来的纸条上,你就会看到两个两个字交换了位置。
(注: |运算可以换成+运算,想一想为什么)

第二个语句。 c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
0x33 = 00110011, 0xCC=11001100。 

第三个语句。c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
0x0f = 00001111, 0xF0=11110000.

这两个语句的作用也是 分组,将一半位变成0,移位滑动,跟着再组合,就分组交换了位置。
不防想象两个小纸条剪洞叠加。

这方法应该可以推广。
理解了问题1,也就很容易理解问题2了.

问题2: 判断32位整数二进制中1的个数。
和问题1一样,也是采用了分组并行计算。

基本方法是: 2位2位为一组,相加,看看有几个1。再4位4位为一组,相加,看看有几个1......
还是说的不太明白。接着分析。

为了简单说明,先看看8位的情形。相应地,函数里面的语句变成。
x = (x & 0x55) + ((x >> 1) & 0x55);   (1)
x = (x & 0x33) + ((x >> 2) & 0x33);   (2)
x = (x & 0x0f) + ((x >> 4) & 0x0f);   (3)
return x;

假设x=abcdefgh. 0x55=01010101
x & 0x55 = 0b0d0f0h.  (x>>1) & 0x55 = 0a0c0e0g。相加。就可以知道2位2位一组1的个数。

比如x=11111111
x= (x & 0x55) + ((x >> 1) & 0x55); 之后x=10101010。你2位2位地看,10=2, 就是2 2 2 2, 就是说各组都是2个1。
比如x=00101001
x= (x & 0x55) + ((x >> 1) & 0x55); 之后x=00010101。你2位2位地看,就是0 1 1 1, 前1组只有0个1,后面的组都是1个1。

好啦。再来看。0x33=00110011。
x=abcdefgh. 
x=(x & 0x33)+((x >> 2)&0x33); 相当于, 00ab00ef + 00cd00gh。
因为语句(1)之后。ab指示了头两位有多少个1,cd指示了下两位有多少个1。相加00ab+00cd就指示前4位有多少个1。这样就是4位4位为一组。注意这样的分组,组与组之间永远都不会产生进位的。正因为不会产生进位,才可以分开来看。

好啦。下面的过程都是一样的,不再多说。
8位,16位,32位都一样。

LeetCode题目详解-7反转整数 7.反转整数 题目: 给定一个 32 位有符号整数,将整数中的数字进行反转。 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。 代... 阅读详情

相关推荐

华为OD机试整数编码详解:二进制分组与标识位算法实践

在计算机科学中,二进制编码是数据表示与传输的基础技术,其核心原理是将信息转换为由0和1组成的位序列。通过位运算和分组策略,可以实现高效、紧凑的数据存储与交换。这种编码技术在通信协议、数据压缩和系统底层交互中具有重要价值,例如在变长编码方案中,通过添加标识位来指示数据边界。本文聚焦于一道高频机试题——整数编码,深入解析其7位分组规则与标识位机制,帮助读者掌握二进制处理、字符串操作等核心技能,并从容应对华为OD等企业技术考察中的编码类问题。

weixin_34405354的博客 463

反转一个字节 和 判断32位整数二进制中1的个数 的算法

反转一个字节 和 判断32位整数二进制中1的个数 的算法 unsigned char reverse8( unsigned char c ){    c = ( c & 0x55 ) > 1;    c = ( c & 0x33 ) > 2;    c = ( c & 0x0F ) > 4;    return c;}unsigned long func(unsigned long x)

todototry的专栏 4611

PHP实现无符号整数的反转位的算法(附完整源码)

PHP实现无符号整数的反转位的算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 185

反转一个字节和判断32位整数二进制中1的个数等算法

  unsigned char reverse8( unsigned char c ){    c = ( c & 0x55 ) > 1;    c = ( c & 0x33 ) > 2;    c = ( c & 0x0F ) > 4;    return c;}unsigned long func(unsigned long x){    x = (x & 0x55555555UL) +

Knocking On The Heaven's Door 3188

Playwright自动化测试实战:攻克日历时间控件三大策略与Java实现

在Web自动化测试领域,元素定位与交互模拟是核心技术基础,其原理在于通过程序精确识别并操作页面中的DOM元素,以模拟真实用户行为。这项技术的核心价值在于提升测试效率、确保交互逻辑的覆盖度与可靠性,广泛应用于电商、金融、OA等系统的功能验证。日历时间控件作为典型的复杂交互组件,常涉及动态弹出层、多级导航与状态同步,是自动化测试中的常见难点。本文聚焦于使用Playwright工具,针对此类控件深入剖析了三种核心解决策略:从最高效的直接赋值、到全面模拟用户交互的主流方法,再到利用组件特性的混合定位方案,并结合Ja

weixin_28835551的博客 312

4D毫米波雷达与激光雷达融合评测:3种主流融合框架在极端天气下的性能对比

本文深度评测了4D毫米波雷达与激光雷达在极端天气下的三大融合框架性能,包括前融合、特征级融合和后融合。通过实测数据对比,揭示了多传感器融合在暴雨、浓雾等恶劣环境中的显著优势,为自动驾驶感知系统提供了关键的技术参考和工程实践指南。

weixin_28677005的博客 331

反转一个字节 和 判断32位整数二进制中1的个数 的算法(ZZ)

呵呵,好东东,共享,好像有一个是微软的面试题unsigned char reverse8( unsigned char c ){     c = ( c & 0x55 ) > 1;     c = ( c & 0x33 ) > 2;     c = ( c & 0x0F ) > 4;     return c;}unsigned long func(unsi

WINCOL的专栏 1120

VisionMaster 4.2.0安装

按照顺序安装。

XuXing_java的专栏 3811

(超强)反转一个字节 和 判断32位整数二进制中1的个数 的算法

[code] unsigned char reverse8( unsigned char c ) { c = ( c &amp; 0x55 ) &gt; 1; c = ( c &amp; 0x33 ) &gt; 2; c = ( c &amp; 0x0F ) &gt; 4; return c; } [/code] [code] unsigned long func(unsigned long x) ...

希望的田野 266

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1321

QT 面试题汇总

一、讲述Qt信号槽机制与优势与不足 优点:①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。 ②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。 ...

编程菜鸟 4万+

【C++ primer】高效的逻辑运算符

一,引例 问题:把一个字节逆置,要求用移位的方法 unsigned char ch 八位 思路一:初始一个unsigned char temp=0; 用1分别左移 0--7位跟ch 相与,如果大于零,则在7-i(相对应的位置置1否则置0) #include &amp;lt;iostream&amp;gt; using namespace std; unsigned c...

小田的专栏 192

图神经网络实战(6)——使用PyTorch构建图神经网络

图数据集通常比简单的连接集合更加丰富,因为节点和边可以具有表示分数、颜色、单词等特征。包含这些额外信息在输入数据中对于生成最佳嵌入至关重要。在本节中,我们将使用 Cora 和 Facebook Page-Page 数据集,首先将它们视为表格数据集,观察香草神经网络在节点特征上的表现如何。然后,尝试在神经网络中加入拓扑信息,实现图神经网络 (Graph Neural Networks, GNN) 架构:一个同时考虑节点特征和边的简单模型。最后,我们将比较两种架构的性能。

盼小辉丶的博客 2万+

统计一个数的二进制表示时1的个数

统计一个数的二进制表示时1的个数。int  func(x) {     int  countx  =   0 ;     while (x)     {        countx ++ ;        x  =  x & (x - 1 );    }      return  countx;}   反转一个字节 和 判断32位整数二进制中1的个数 的算法 unsigned ch

ouyangzp的专栏 972

Virtual Hard Disk version 2 (VHDX) 文件格式详解

VHDX 镜像格式详解 0. References windows github 1. Overview Microsoft 虚拟化产品中常用的映像格式是虚拟硬盘版本 2 (VHDX) 映像格式。该规范基于可用文档,并通过分析测试数据进行了增强。 VHDX 镜像格式种类 固定硬盘镜像 动态硬盘镜像 差异硬盘镜像 VHDX 镜像文件由以下元素构成: file (type) identifier 2x image headers 2x region tables log or metadata journ

圣三一 2697

ESP32学习笔记06-UART 的485 通讯模式

通信方式选择UART 控制器支持多种通信模式,使用函数 uart_set_mode() 可以选择模式。选择特定模式后,UART 驱动程序将处理已连接 UART 设备的相应行为。例如,主机开始向 Tx FIFO 缓冲区写入数据时,UART 驱动程序会自动置位 RTS 管脚(逻辑 1);最后一位数据传输完成后,驱动程序就会取消置位 RTS 管脚(逻辑 0)。要使用此模式,软件。

Car12 2476

反转一个字节(详细解析)

unsigned char reverse8( unsigned char c ) {      c = ( c & 0x55 ) > 1;      c = ( c & 0x33 ) > 2;      c = ( c & 0x0F ) > 4;      return c; } unsigned long func(unsigned long x) {      x =

铁匠Smith先生的专栏 4575

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode—整数反转

题目地址 题目名称:两数之和 难度:⭐ 题目描述: 给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例1: 输入:123 输出:321 示例2: 输入:-123 输出:-321 示例3: 输入:120 输出:21 注意: 假设我们的环境只能存储得下32位的有符号整数,则其数值范围为[-231,231-1]。请根据这个假设,如果反转后整数溢出那么就返回0。 ????‍♂️????‍♂️????‍♂️????‍♂️????‍♂️????‍♂️????‍♂️????‍♂️????‍

z2bns的博客 444

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LeetCode 7:整数反转(java)

还有一种更为巧妙地判断反转过后的整数是否溢出的方式,就是先得到反转后的结果newResult,如果newResult已经溢出,其值将会改变(会丢掉溢出的二进制数部分,而不是抛出异常),(newResult - tail) / 10的值将和它上一轮的值不等,代表此时已经溢出直接返回0。如果 res==Integer.MAX_VALUE/10,那么只要 pop>7,temp=res⋅10+pop就会溢出。如果输入的整数在整数范围内,但是反转过后超出整数范围,需要返回0。,现在起闭关修炼半个月,争取早日上岸!

H1767410的博客 1031

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

leetCode有溢出限制的整数反转输出

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。 原理如图 每次取出最后一位放入新的变量中尾部,取出操作使用取余运算符,插入尾部操作可以使旧数向前移1位加上新的尾部,即旧数*10+最后一位,得到新的number,直到x=0,即所有位都反转成功。 代码如下 class Solution { //传入并返回整形参数 int r

peanut_trees的博客 265
上一篇: 动态规划 最短路径
下一篇: 矩阵乘法的实现-将2维数组作函数的参数
suchfool
博客等级 码龄17年 9粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值