二进制位交换 反转 计数

C/C++位反转算法详解:从原理到高性能实现 位操作是底层编程与高性能计算的核心基础,它直接操作数据的二进制位,是理解计算机数据表示和运算的关键。其原理基于与、或、移位等基本逻辑运算,通过组合这些操作可以实现复杂的数据变换。位操作的技术价值在于其极高的执行效率,能够绕过高级语言抽象,直接利用硬件特性进行优化,在性能敏感场景中至关重要。应用场景广泛,包括嵌入式系统寄存器配置、加密解密算法、图形处理以及网络协议解析等。本文聚焦于位反转这一经典问题,深入剖析了查表法和分治法两种高效实现,并提供了可复用的C++模板代码,帮助开发者在FFT、通信协议转换等实际工 阅读详情


如何交换一个整形数的二进制表示的其中两位.

比如要把a,与b进行交换。那么方法如下:x表示任意值。

xxxx xxxx xxxx xaxx xxxx xxbx xxxx xxxx


分为两步:

第一步:首先要求得

xxxx xxxx xxxx x0xx xxxx xx0x xxxx xxxx

第二步:在第一步的基础上加上:

0000 0000 0000 0b00 0000 00a0 0000 0000



第一步的代码可以写做:两位置值表示为x, y。数值表示为v

ret = v & (~(1<<x)) & (~(1<<y))

第二步代码:

ret = ret | (((v>>y)&1)<<x) | (((v>>x)&1)<<y);

总结一下代码,写做

这里粘个代码

void _swap(unsigned int &v, int x, int y)
{
	//思路:第一步先减去0000x0000,再减去00000y0000;
	//      第二步先加上000y0000,再加上0000x0000;
	//	    可以一句话完成.

	//说明思路的代码:
	//unsigned int x_pos = ((v>>y)&1)<<x;
	//unsigned int y_pos = ((v>>x)&1)<<y;
	//unsigned int x_value = ((v>>x)&1)<<x;
	//unsigned int y_value = ((v>>y)&1)<<y;
	//v -= (x_value + y_value);
	//v += (x_pos + y_pos);
	//print_int(v);


	//终极版:
	//一句话也可以完成。
	v = v & (~(1<<x)) & (~(1<<y)) | (((v>>y)&1)<<x) | (((v>>x)&1)<<y);
}

如何把二进制位按中间对折

比如100对折之后成为001。

不过这里的长度要求是32位的。也就是31位与0位互换,以此类推。

这里就不多说了,《代码之美》一书中提供了一种分治的思想来进行1位计数。这里同样利用这种分治思想来处理

unsigned int bit_reverse(unsigned int n)
{
	n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
	n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
	n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
	n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
	n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
	return n;
}
看一下对char的处理

unsigned char ReverseBits(unsigned char ch)
{
ch = (ch &0x55) <<1| (ch >>1) &0x55;
ch = (ch &0x33) <<2| (ch >>2) &0x33;
ch = (ch &0x0F) <<4| (ch >>4) &0x0F;
return ch;
}
先看看0x55,0x33,0x0F的二进制
0x55 -> 01010101 B
0x33 -> 00110011 B
0x0F -> 00001111 B
从中可以看出,是先将相连的两bits对调实现相连2 bits数据翻转;

接着两个相连的“2 bits组合”对调实现相连4 bits数据翻转;

再下来就是将两个相连的“4 bits组合”对调即可以完成对一个字符8 bits的翻转。

对于更多bytes 的数据做同样的处理。单数个bits呢,这个就需要思考一下了。


如何对整形数计算1的个数

《编程之美》上面的代码其实并不高效,这里给个《代码之美》中猛的代码

int cnt(unsigned int x)
{
	x = x - ((x>>1)&0x55555555);
	x = (x & 0x33333333) + ((x>>2)&0x33333333);
	x = (x + (x>>4)) & 0x0f0f0f0f;
	x = (x + (x>>8));
	x = (x + (x>>16));
	return x&0x3f;
}

做这个处理有一个经典的方法,分治策略( divide and conquer strategy ),该方法来源于Henry S.Warren 的《Hacker's Delight》对Reversing Bits 的介绍。



纯JS实现SM3加密算法(兼容IE浏览器) 纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。 阅读详情

相关推荐

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1249

二进制反转

题目描述: 请编写函数,这个函数的返回值是把value的二进制位模式从左到右变换一下后的值。例如,在32位机器上,25这个值包含下列各个位: 000000000000000000000000000000011001 函数的返回值应该是2550136832,它的二级制位模式是: 100110000000000000000000000000000000 编写函数时要注意不要让...

ThinPikachu的博客 4658

疫情数据分析的“核武器”!JHU CSSE COVID-19数据集超深度解析与实战指南(附代码)

在面对这场没有硝烟的战争时,除了医护人员在前线与病毒搏斗,还有一群默默的英雄——数据科学家和分析师,他们利用手中的“数据武器”,昼夜不停地监测、分析、预测疫情走势,为政府决策、资源调配、公众科普提供了至关重要的支撑。同时,由于某些国家(如美国、加拿大、澳大利亚、中国等)的数据细化到省/州级别,为了得到国家层面的总数据,我们需要按国家和日期进行聚合。正是在这样的背景下,经过这些步骤,我们已经得到了一个包含了累计数据、每日新增数据和活跃病例数的完整数据集,可以开始进行深入的分析和可视化了!

wylee的博客 1165

二进制翻转

编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值是value的二进制位模式从左到右翻转后的值。 如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回: 2...

unique_IT的博客 3351

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2750

阿里云Ubuntu部署Steam饥荒联机版服务器:从零到多人联机的完整指南

本文详细介绍了在阿里云Ubuntu系统上部署Steam饥荒联机版服务器的完整流程,包括环境准备、SteamCMD安装、服务端配置、Mod管理及后台运行技巧。通过2核4GB的ECS实例配置和端口设置,实现5人流畅联机体验,适合游戏爱好者快速搭建专属服务器。

weixin_29229261的博客 1026

xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Get Authorization code:Request: https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&prompt=consent&response_type=code&client_id=...

weixin_34273481的博客 73万+

SPSS新手教程—两步聚类之结果解读

在《详解SPSS两步聚类之参数设置》一文中,我们已经了解了两步聚类的优点、分析原理,以及参数设置的技巧。 在本节中,会对IBM SPSS Statistics聚类后的结果进行解读,其中会涉及到最终聚类的结果、聚类的质量、变量重要性、聚类特征的解读。 如图1所示,我们先来回顾下本例数据在参数设置面板中的详细设置。 图1:二阶聚类设置 一、数值结果 根据上述参数设置,得到如下的数值分析结果。 首先看到自动聚类结果,如图2所示为聚类的透视表结果,展示了不同聚类数目下的BIC、BIC变化量、BIC变

nekonekoboom的博客 3万+

二进制数反转

问题 将一个二进制数反转 如: Input: 00000010100101000001111010011100 Output: 00111001011110000010100101000000 解决方案 可以预设一些反转结果,如四位数的反转结果可以写作如下数组 char nums[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; 设L表示预设的反转结果的...

ljp82nlf的博客 2200

Neo4j桌面版导入CVS文件

我们的relation.csv是这样的。

m0_53573725的博客 818

从零构建SOEM主站:基于STM32的EtherCAT伺服控制实战指南

本文详细介绍了如何从零构建基于STM32的SOEM主站系统,实现EtherCAT伺服电机的高精度控制。通过硬件选型、SOEM协议栈移植、PDO/SDO配置优化等实战步骤,帮助开发者掌握工业自动化中的关键运动控制技术,特别适用于23位编码器伺服电机的应用场景。

weixin_29186249的博客 666

二进制的左右翻转。

编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回:2550136...

身在边城 心在编程 2169

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2811

位运算的奇技淫巧:Bit Twiddling Hacks

原文名:Bit Twiddling Hacks 原文地址:http://graphics.stanford.edu/~seander/bithacks.html 作者:Sean Eron Anderson, seander@cs.stanford.edu 本文所包含的代码片段不受著作权法的限制(除非有特别注明),任何人可以自由使用。本文的收集整理工作由Sean Ero...

优快云文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 7215

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

二进制位交换,反转,与统计1的个数

问题一:给一个整数v,求它的二进制表示中从右往左数第x位和第y位交换后的值(从0开始计数)。   分析:举个例子,如果v的二进制表示为XXXXaXXXXXXbX,我们交换第1位和第8位。我们是这样做的: 先把这两位的值都取零后的值保存在一个变量里面,即tmp = XXXX0XXXXXX0X,然后再取ans = 0000b000000a0,那么可 以看出tmp | ans就是答案了。现在关键

ACdreamer 3850

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

p24 p25作业讲解(2)

标称实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19。写一个递归函数DigitSum(n),输入一个非负整数,返回组成他的数字之和。获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。输入:1729 输出19。

monkeyhost的博客 421

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LeetCode 190.颠倒二进制位

将 n 视作一个长为 32 的二进制串,从低位往高位枚举 n 的每一位,将其倒序添加到翻转结果 rev 中。代码实现中,每枚举一位就将 n 右移一位,这样当前 n 的最低位就是我们要枚举的比特位。当 n 为 0 时即可结束循环。需要注意的是,在某些语言(如 Java)中,没有无符号整数类型,因此对 n 的右移操作应使用逻辑右移。

qq_46121420的博客 333

Bit Twiddling Hacks

Bit Twiddling Hacks By Sean Eron Anderson seander@cs.stanford.edu Individually, thecode snippets here are in the public domain(unless otherwise noted) — feel free to use them however you please. T...

ayang1986的专栏 664

LeetCode——颠倒二进制位&位1的个数

NO.190 颠倒二进制位 简单 、NO.191 位1的个数 简单 NO.190 颠倒二进制位 简单 思路一:逐位颠倒 每次用 & 运算取出 n 的最低位,将 ans 左移一位后用 ^ 运算保存得到的最低位。每次将 n 右移一位。 public int reverseBits(int n) { int ans = 0; for (int i = 0; i < 32; i++) { ans = (ans << 1) + (n & 1);

qq_42758551的博客 270

高频二进制位运算常用模板

常用于树状数组 (Fenwick Tree) 等算法。

qq_43664407的博客 470

20.颠倒二进制位和位1的个数-leetcode

颠倒给定的 32 位有符号整数的二进制位。9641761921073741822(1)解题思路分治+位掩码合并(经典“蝴蝶”反转)核心观察:反转 = 不断交换相邻块。步骤(块长依次为 1→2→4→8→16):① 交换所有相邻 1 位② 交换所有相邻 2 位③ 交换所有相邻 4 位④ 交换所有相邻 8 位⑤ 交换相邻 16 位每一步都用掩码保留一半、移位后再合并,共 5 条位运算语句。时间复杂度 O(1),常数比循环更小。(2)代码(c)(3)总结。

2501_91344547的博客 685

写一个宏可以将一个数字的二进制代码的奇数位和偶数位交换

1、写一个宏可以将一个数字的二进制代码的奇数位和偶数位交换。#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #define SWAP(x) (((x&amp;0xaaaaaaaa)&gt;&gt;1)+((x&amp;0x55555555)&lt;&lt;1)) int main() { int a = 10; int ret = SWAP(a...

lu_1079776757的博客 362

[基础算法] --- 位运算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JUn5T7U-1721627042685)(https://i-blog.csdnimg.cn/direct/552453030c454160ab0a304c60be24ca.png)]

M2嵌入式 2012

代码随想录 Day17 字符串 | LC344 反转字符串 & LC541 反转字符串II & 卡码网54替换数字

代码随想录 Day17 字符串 | LC344 反转字符串 & LC541 反转字符串II & 卡码网54替换数字

妖怪森林的博客 1090

嵌入式软开面试常见的手写代码

1、冒泡排序: void BubbleSort(int arr[], int len) { for (int i = 0; i < len-1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]) { Swap(&arr[j], &arr[j+1...

XBlog 1682

LeetCode 刷题 --位运算

文章目录461.汉明距离191. 位1的个数190.颠倒二进制位136.只出现一次的数字268.缺失数字不用额外变量交换两个整数2的幂 461.汉明距离 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们之间的汉明距离。 注意: 0 ≤ x, y < 231. 示例: 输入: x = 1, y = 4 输出: 2 解释: 1 (...

只不停的博客 435
上一篇: 二分查找之变形
下一篇: ACM 算法艺术与信息学竞赛 1.2.7 超长数字串
ju136
博客等级 码龄19年 95粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值