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 10101010 10101010b;
		int odd=(x&0xaaaaaaaa)>>1;

		//偶数位左移,0x5555 5555=01010101 01010101 01010101 01010101 01010101 01010101 01010101 01010101b;
		int even=(x&0x55555555)<<1;

		return odd|even;
	}

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

时间: 2024-08-28 11:10:24

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

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

今天在一本书上看到一题:编写程序交换某个整数的奇数位和偶数位,使用指令越少越好(即位0与位1交换,位2与位3交换).看过题目解析之后才发觉,这题要交换的是整数二进制的奇数和偶数位. 按照一般的解题肯定会对每一位分别处理,即,将整数换成二进制,然后遍历一遍,交换奇数位和偶数位.这样效率不高,指令也不少.然后看大题目解析,感觉用位操作很棒,以下为解题思路: (1)先操作奇数位,把101010(即0xAA)作为掩码,提取奇数位,并右移1位到偶数位置 (2)操作偶数位,把010101(即0x5555)作

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

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

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

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

Redis 设计与实现(第六章) -- 整数集合(intset)

概述 1.intset概述 2.intset实现 3.intset升级 intset概述 整数集合是Redis集合键的底层实现之一,当值都为整数时,redis就会选择整数集合作为底层实现. 可以保存int16_t,int32_t,int64_t类型的整数值,并且集合中不会出现重复元素. intset实现 先看下intset的数据结构: typedef struct intset { uint32_t encoding; //encoding方式 uint32_t length; //长度 int

位运算 - 六十四位整数乘法

求 a 乘 b 对 p 取模的值. 输入格式 第一行输入整数a ,第二行输入整数b,第三行输入整数p . 输出格式 输出一个整数,表示a*b mod p的值. 数据范围 1≤a,b,p≤1018 输入样例: 3 4 5 输出样例: 2 #include <stdio.h>typedef unsigned long long ULL;int main(){    ULL a,b,p;    ULL res = 0;    scanf("%llu%llu%llu",&a

不创建临时变量,交换两整数的值

(1)加减法:a=a+b;b=a-b;a=a-b; (2)乘除法:a=a*b;b=a/b;a=a/b; (3)异或运算:a=a^b;b=a^b;a=a^b;(遇到a可翻译b,遇到b可翻译a) ^异或(按位异或):相同出0,相异出1. 如:2    0000 0000 0000 0010 3    0000 0000 0000  0011 2^3      0000 0000 0000 0001 =1 2^3^2  0000 0000 0000 0011=3 --加减运算#include <std

位操作 + 数某十进制整数的二进制中的1的个数

1 #include <stdio.h> 2 int getbit( int a,int i) 3 { 4 return a&(1<<i);// 只取数字a第i位上的值 5 } 6 int main() 7 { 8 int n; 9 while(scanf("%d",&n)!=EOF) 10 { 11 int i; 12 int count=0; 13 int tem=-1; 14 for(i=0;i<32;i++)//int 32位 15

六十四位整数乘法

c艹下的 long long 乘法, 用到的算法是龟速乘法 #include<bits/stdc++.h> using namespace std; long long slowmul(long long a, long long b, long long p) { long long res = 0; for(; b; b>>=1, a=(a+a)%p) if(b&1) res = (res + a) % p; return res % p; } int main() {

16位整数,32位整数,64位整数

首先解释16位整数:所谓16位整数就是16个二进制位(16#7FFF)而对应的最大整数为32767:PLC中是用二进制的补码来表示有符号数的,定义最高位为符号位:当最高位位0时为正:最高位为1时为负;所以经过换算就是-701:(补码是正数先求反码(0变1:1变0)然后加1): 以次内推,32位,64位也是如此.