交换整数的奇数位和偶数位

今天在一本书上看到一题:编写程序交换某个整数的奇数位和偶数位,使用指令越少越好(即位0与位1交换,位2与位3交换)。看过题目解析之后才发觉,这题要交换的是整数二进制的奇数和偶数位。

按照一般的解题肯定会对每一位分别处理,即,将整数换成二进制,然后遍历一遍,交换奇数位和偶数位。这样效率不高,指令也不少。然后看大题目解析,感觉用位操作很棒,以下为解题思路:

(1)先操作奇数位,把101010(即0xAA)作为掩码,提取奇数位,并右移1位到偶数位置

(2)操作偶数位,把010101(即0x5555)作为掩码,提取偶数位,并左移一位到奇数位置

(3)将两次操作结果合并成一个值。

代码如下:

  public static int swapOdEventBits(int x){
	  return (((x & 0xaaaaaaaa) >>1)|( ( x & 0x55555555 ) << 1));
  }

操作32位数时,掩码用8位十六进制即可,如果是64位,就要用16位十六进制掩码。

这样做的好处是,不需要将整数换成二进制,直接位操作返回的就是交换后的十进制整数,操作少。

补充:

1.java中十进制转成二、八、十六进制方法;

Integer.toBinaryString(int x);十->二

Integer.toOctalString(int x);十->八

Integer.toHexString(int x);十->十六

返回的均为String类型

2..java中二、八、十六进制字符串转成带符号的十进制方法;

int java.lang.Integer.parseInt(String s,int radix);返回为int

第二个参数表示串S的进制,如 Integer.parseInt("1100110",2);返回102

或者  Integer java.lang.Integer.parseInt(String s,int radix);返回为Ingeter类型

区别:Integer为包装类,Integer可以直接使用object方法,可以直接转换成int,而int不能转换成Integer。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-01 20:55:57

交换整数的奇数位和偶数位的相关文章

9.5位操作(六)——交换某个整数的奇数位和偶数位,使用指令越少越好

/** * 功能:交换某个整数的奇数位和偶数位,使用指令越少越好(即,位0与位1交换,位2与位3交换,以此列推). */ /** * 思路:先操作奇数位,再操作偶数位.将数字n的奇数位右移1位,偶数位左移1位. * @param x * @return */ public static int swapOddEvenBits(int x){ //奇数位右移,0xaaaa aaaa=10101010 10101010 10101010 10101010 10101010 10101010 1010

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

题目 原文: 写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现. (比如,第0位和第1位交换,第2位和第3位交换…) 解答 这道题目比较简单.分别将这个整数的奇数位和偶数位提取出来,然后移位取或即可. 代码如下: int swap_bits(int x){ return ((x & 0x55555555) << 1) | ((x >> 1) & 0x55555555); } 当然也可以采用更自然的方式来写这段代码: int swap_bits1(

获取一个数二进制序列中所有的偶数位和奇数位

思路:要判断一个整数的二进制偶数位是0还是1,则可以用这个整数和1或2进行&的用算,之后进行右移在进行&的用算,知道右移为0结束. 可以利用这种方法提取二进制数. 1 #include<stdio.h> 2 #define _CRT_SECURE_NO_WARNINGS 3 4 void Find_even(int a) 5 { 6 //int c; 7 //int a = 11;//0000 1011 8 //int b = 12;//0000 1100 9 // 36 00

c语言:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列. 程序: #include<stdio.h> int main() { int i, j, num; char arr1[16]; char arr2[16]; printf("输入一个整数:"); scanf("%d", &num); for (i = 0, j = 0; i < 32; i += 2, j++) { arr1[15 - j] = (num >> 

C语言获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

#include<stdio.h> int main() { int num,i,j,m,a[16],b[16];  scanf("%d",&num); m=sizeof(a)/sizeof(a[0]); for(i=0,j=0;j<32;i++,j+=2) { a[m-1-i]=(num>>j)&1;/*num向右移动j位,数组a被倒序输入*/   } printf("偶数位为:"); for(i=0;i<m;i

【C语言】获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列

#include<stdio.h> int main() { int arr[32]; int m=0,i=0,count=0; printf("请输入一个十进制数:\n"); scanf("%d",&m); for(i=0;m!=0;i++)     {          arr[i]=m%2;         m=m/2;         count=i+1;     }     for(;count<32;count++) {    

”高精度整数删去若干位以使剩下的值最小“问题

问题描述: 键盘输入一个高精度的正整数N(不超过240位) ,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的N和M,寻找一种方案使得剩下的数字组成的新数最小.输出组成的新的正整数. 输入数据均不需判错. 如果去掉了某几个位后得到的新整数开头为0,保留0. 输入: 本题有多组测试数据,每组测试数据占一行. 一个高精度正整数N(N不超过240位)一个正整数M.(M为不大于N的长度的正整数) N,M由一个空格分开. 456547 1 456547 2 456547 3

将一个字符串,按照奇数位和偶数位分别存放到不同的字符串中

题目描述:给定一个字符串 要求写一个函数,实现以下功能 功能1:吧偶数位字符挑选出来,组成一个字符串 功能2:吧奇数位字符挑选出来,组成一个字符串 // 将一个字符串,按照奇数位和偶数位分别存放到不同的字符串中 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include<string.h> #include<stdio.h> int getStr1Str2(char * source, char *buf1,

Python(63)_写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其返回

`#-*-coding:utf-8-*- ''' 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其返回 ''' def func(l): return l[1::2] print(func([1,2,3,4,5,7])) 原文地址:https://www.cnblogs.com/sunnybowen/p/10257583.html