交换一个整数二进制表示中的奇数位和偶数位

题目

原文:

写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现。 (比如,第0位和第1位交换,第2位和第3位交换…)

解答

这道题目比较简单。分别将这个整数的奇数位和偶数位提取出来,然后移位取或即可。

代码如下:

int swap_bits(int x){
    return ((x & 0x55555555) << 1) | ((x >> 1) & 0x55555555);
}

当然也可以采用更自然的方式来写这段代码:

int swap_bits1(int x){
    return ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1);
}

上面的代码思路和作用都是一样的,不过按照《Hacker’s delight》这本书里的说法, 第一种方法避免了在一个寄存器中生成两个大常量。如果计算机没有与非指令, 将导致第二种方法多使用1个指令。总结之,就是第一种方法更好。

时间: 2024-09-21 11:17:40

交换一个整数二进制表示中的奇数位和偶数位的相关文章

编程-给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。

问题描述 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数. (在文件中至少缺失一个这样的数为什么?)括号里的话怎么得到的 在具有足够内存的情况下,如何解决该问题? 如果有几个外部的临时文件可以用,但是只有几百字节的内存,又该如何解决该问题. 解决方案 足够内存,用位图法.定义一个arr[4294967296]大小的数组,遍历顺序文件,遇到一个值,就把对应下标的置1,最后遍历这个数组,找0的元素. 解决方案二: 如果只有几百的内存,可以用hashtable.

《剑指offer》-统计整数二进制表示中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位操作,但还是麻烦.直接按照int的位数,32或64,做这么多次移位操作就好了,每次移位操作累计是否为1.int的位数是32还是64,可以写一个函数来做到,而不是硬编码. class Solution { public: int NumberOf1(int n) { int cnt = 0; int

二进制-java中的64位数据和32位数据的区别

问题描述 java中的64位数据和32位数据的区别 之前在看数据之间的相互比较的时候,遇到这样一个问题 "数值间的相等比较,本质是比较他们二进制存储是否相等.例如:0.3f==0.3返回的是false(32位的2进制的0.3表示和64位的0.3表示是不同的):但是0.5f==0.5返回的是true(因为32位和64位的二进制表示是相同的)" 那么我怎么知道要比较的这两个数在32位和64位中是否相等呢,有什么办法吗> 本人初学java,还望给各位多多指点 解决方案 32位和64位下

c#-C#文本文件中怎么写入一个整数?为什么读取出来的不是整数?用的是textreader?

问题描述 C#文本文件中怎么写入一个整数?为什么读取出来的不是整数?用的是textreader? C#文本文件中怎么写入一个整数?为什么读取出来的不是整数?用的是textreader? 解决方案 直接用File.ReadAllText读取到字符串,然后正则表达式提取出文本,int.Parse解析 解决方案二: c# 里面不存在整数 全部都是字符串 读出来就是字符串 然后转化为整数 解决方案三: 读取的文本信息都是String,你在txt里写个2,程序怎么知道只是2还是"2". 解决方案

微软面试题解析:整数的二进制表示中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 使用移位操作,来实现. 具体实现如下: #include<iostream> using namespace std; int binary1num(int d) { int cnt = 0; while(d/2 != 0) { if(d%2 == 1) cnt ++; d = d/2; } if(d%2 == 1) cnt ++; return cnt; } in

C++通过自定义函数找出一个整数数组中第二大数的方法

  本文实例讲述了C++通过自定义函数找出一个整数数组中第二大数的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 const int MINNUMBER = -32767 ; //2字节的Int 0x8000-1, //4字节的Int 0x80000000-1 -2147483647 int find_sec_max( int data[] , int count) { int

统计一个二进制字符串中1的个数的算法

记得在吴军的<数学之美>中有一章讲到布尔代数和搜索引擎的索引.大概是讲通过一个二进制字符串来标识当前关键词在那些文档中出现过.二进制字符串中1的位置就是出现这个词文档的id. 如,一淘 对应一个二进制字符串 1010001.其中在1,5,7三个位置出现了1,说明文档id为1,5,7的文章包含词"一淘".但是在书中没有说如何统计1的个数和位置.现在我补充以下实现算法. 代码如下: #include <iostream> #include <math.h>

c语言-C语言 给定一个整数序列和一个数k,求这个序列中第k小的数。

问题描述 C语言 给定一个整数序列和一个数k,求这个序列中第k小的数. C语言 给定一个整数序列和一个数k,求这个序列中第k小的数. 我的程序 #include<stdio.h> int n[10000]; void Nok() { int i=0,j=0,t,k,q=0; char c; scanf("%d",&n[i++]); c=getchar(); while(c!='n') { scanf("%d",&n[i++]); c=ge

如何判断一个整数的二进制中有多少个1_C 语言

复制代码 代码如下: // 判断一个整数的二进制位中有多少个1void totalOne(int x){ int count = 0; while(x) {  x = x & ( x - 1 );  count++;  } printf("count = %d/n", count);} 循环: x = x & ( x - 1 ); count++; 直到x为0为止.该方法的时间复杂度是O(m)在此,不妨把x的二进制位表示为          x=an-1an-2...a