`
iwebcode
  • 浏览: 2004587 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

二进制反转整数

 
阅读更多

public static int reverse(int i) {

// HD, Figure 7-1

i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;

i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;

i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;

i = (i << 24) | ((i & 0xff00) << 8) |

((i >>> 8) & 0xff00) | (i >>> 24);

return i;

}

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

反转成功。

这样的算法本来很是简单,很容易用数学归纳法证明其正确。这函数,巧妙就巧妙在作了并行计算,分组,它一次就计算完了。

分享到:
评论

相关推荐

    程序员二进制计算器 v1.36

    支持与、或、非、异或、移位(循环、逻辑、算术),直接读写二进制位,指定位段读、写、置1、清0、反转。 二进制数据表达方式多样,数据可以K、M、G等单位为后缀。 支持类C语言库函数调用。 结果可以各种进制、各种...

    二进制补码字符串:二进制定点二进制补码字符串和十进制数之间的转换。-matlab开发

    这些函数像内置的 MATLAB 函数 BIN2DEC 和 DEC2BIN 一样在二进制字符串和十进制数之间进行转换,但可以容纳负整数(通过二进制补码)和分数正负数(通过二进制补码固定点和字符串中的二进制小数点)。 请注意,许多...

    yooubei#leetcode_answer#7.反转整数1

    c答案c++答案java答案public int reverse(int x) {//i为整数的位数//j为余数//y为反转后的二进制数JavaScript答案

    模块化反演:模块化反演二进制算法的复杂度分析

    模块化反演二进制算法的复杂度分析 该仓库由两个文件夹组成-“ src原始算法”和“计数操作”。 src原始算法 该文件夹包含本文中通过设计实现的原始算法。 他们只是在很小的数量上进行了测试,以确保实现的质量。 ...

    99乘法表java源码-JavaStudyCode:Java学习代码

    十进制整数和小数与二进制的转换举例 首先我们要搞清楚下面两个问题: (1) 十进制整数如何转化为二进制数 算法很简单。举个例子,11表示成二进制数: 11/2=5 余 1 5/2=2 余 1 2/2=1 余 0 1/2=0 余 1 0结束 11二进制...

    图像反转:InvertIm 在反转灰度的意义上反转图像数组 im(非矩阵反转)-matlab开发

    im 可以是由数字或二进制元素(整数 [uint8、int8、uint16、int16 等]、浮点 [double 或 single] 或逻辑)组成的任何维度的数组。 结果 invIm 是与 im 相同的数据类。 对于数值数组,逆计算使用invIm = (maxVal + ...

    30个C#小程序学习C#的基

    30个C#小程序: ...十进制转换成二进制 实时获取CPU使用率 实现关机-危险勿试 实现一个数的N次方 输出素数 输出随机数 输出图形 宿舍值日 验证概率 一到一百之间的素数 以二进制读取文本文件 朦胧诗

    TCL(Tool Command Language)练习题及答案

    9、编写一个TCL脚本,将一个整数转换为二进制表示。 10、编写一个TCL脚本,判断一个整数是否为素数。 11、编写一个程序,计算从1到100的所有偶数的和。 12、找到一个字符串中出现次数最多的字符 13、找到...

    丢失的最小正整数leetcode-LeetCode:力码

    二进制求和 69 x的平方 70 爬楼梯 83 删除排序链表中的重复元素 108 将有序数组转换为二叉搜索树 112 路径总和 125 验证回文串 136 只出现一次的数字 139 单词拆分 141 环形链表 160 相交链表 169 多数元素 191 位1...

    C#小程序(30个)

    以二进制读取文本文件.txt 何意数排序.txt 关闭特定程序.txt 判断是否为汉字.txt 利用列表排n个数的序.txt 加密.txt 十进制转换成二进制.txt 发奖学金.txt 实时获取CPU使用率.txt 实现一个数的N次方.txt 实现关机-...

    判断链表是否为回文链表leetcode-Leetcode:力码

    判断链表是否为回文链表 ...位整数“11”的二进制表示为 00000000000000000000000000001011,因此该函数应返回 3。 致谢:特别感谢@ts 添加此问题并创建所有测试用例。 最长回文子串 给定一个字符串

    算法面试题

    :请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。:给定单向链表的头指针和一个结点指针,定 义一个函数在O(1)时间删除该结点。:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表

    判断链表是否为回文链表leetcode-leetcode-[removed]使用javascript编写leetcode

    0007-反转整数 0190-反转二进制位 这一类题目就想办法从低位到高位取到原数字每一位,每取到一位就将结果先乘以进制值再加上这个位,更简单的做法是转换成字符串再反转。 滑动窗口 0003-无重复字符的最长子串 0149-...

    C语言程序设计-精选习题和案例

    递归实现字符串逆序,爱因斯坦台阶问题,字符串拆分到数组,Sin(X)展开式,二进制回文,地铁导航,绘制cos(x)曲线,魔方矩阵,插入单词,通用数据类型的设计,约瑟夫问题,数字反转,有机体生命游戏,N!有多少个尾数...

    lrucacheleetcode-oh-my-leetcode:Leetcode题解

    的二进制表示为 00000000000000000000000000001011,因此该函数应返回 3。 **第 0002 题:**First Missing Positive 给定一个未排序的整数数组,找到第一个缺失的正整数。 例如,给定 [1,2,0] 返回 3,而 [3,4,-1,1]...

    leetcode2sumc-CodingChallenges:来自各种来源的一组编码挑战。用C++实现的解决方案

    给定一个二进制数组,找出该数组中连续 1 的最大数目。 示例 1:输入:[1,1,0,1,1,1] 输出:3 说明:前两位或后三位为连续的1。 连续 1 的最大数量为 3。 笔记: 输入数组将只包含 0 和 1。输入数组的长度为正整数,...

    Data-Structures-and-Algorithms-in-[removed]用JavaScript实现的数据结构和算法

    合并排序数组合并两个排序的链表检查单链表是否是回文在原处反转字符串(以字符数组形式输入) 最小堆栈(堆栈DS,在恒定时间O(1)中获得堆栈的最小值) 重复排列在二叉搜索树中搜索有效字谜从二进制链接列表中获取...

    leetcode学生优惠-leetcode:leetcode

    7反转整数 26从排序数组中删除重复项 104二叉树的最大深度 121个买卖股票的最佳时机 122买卖股票的最佳时机 II 125有效回文 136单号 第189话 206反向链表 第217话 237删除链表中的节点 258加数字 283移零 第326章 三...

    leetcode有效期-Leetcode-Javascript-Solutions:我对LeetCode问题的回答

    位有符号整数,反转整数的数字。 8 字符串到整数 (atoi) 实现 atoi 将字符串转换为整数。 65 有效号码 验证给定的字符串是否可以解释为十进制数。 204 数素数 计算小于非负数 n 的素数的数量。 344 反转字符串 编写...

    DailyPractice

    计算非负整数的二进制(不带前导0)的反码;计算x的最大整数平方根; 2020_11_20:寻找整型分布中出现次数大于多个元素数一半的元素(摩尔投票法) 2020_11_21:杨辉三角;找杀手 2020_11_22:大小端判断;简易...

Global site tag (gtag.js) - Google Analytics