C语言位操作--不用中间变量交换两数值
1、使用加法与减法交换两数值:
#define SWAP(a, b) ((&(a) == &(b)) || \
(((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))
这种交换数值a与b的方法没有使用临时变量,初始化检测a,b,如果在同一内存区,则被忽略,当然这通常不会发生,(编译器会忽略,然而无论如何都是一种优化),假如可以确
定溢出异常,于是传递无符号数异常就不会抛出。
下面的逻辑“或”运算的方法在某些机器上可能要快一些,不要使用浮点型数字。
2、使用逻辑“或”方法交换两数值:
#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))
3、使用逻辑“或”方法交换独立位:
unsigned int i, j;
unsigned int n;
unsigned int b;
unsigned int r; unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - ); // XOR temporary
r = b ^ ((x << i) | (x << j));
其中:b为目标数字,以二进制的形式表示,从最右边比特位开始计算,标号为0,i指向第i+1个比特位,
n指连续比特位的个数,j指向第j+1个比特位,r保存交换后的值。
e.g. b = 00101111 n=3,i=1,j=5
r = 11100011
C测试代码如下:
#include <stdio.h>
#include <string.h> void tranlate(int n) //十进制转换为二进制
{
int a[];
int i,L,j;
i=L=;
while(n/){
a[i]=n%;
n/=;
L++,i++;
}
a[i]=;
while(L<){ //设置为显示8位的二进制
a[++i]=;
L++;
}
for(j=L-; j>=; j--){
printf("%d",a[j]);
}
printf("\n");
} int main(int argc, char *argv[])
{
unsigned int i, j;
unsigned int n;
unsigned int b;
unsigned int r;
b=,n=,i=,j=;
tranlate(b);
unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - );
r = b ^ ((x << i) | (x << j));
tranlate(r);
getchar();
getchar();
return ;
}
C语言位操作--不用中间变量交换两数值的更多相关文章
- java不用中间变量交换两个值
public void changeVal(){ int a = 2; int b = 3; System.out.println("交换前 a:"+a+",b:&quo ...
- 不用中间变量交换两个数 swap(a,b);
#include <iostream> using namespace std; int main () { ; ; cout<<"a="<<a ...
- 编程技巧:使用异或操作符(XOR)交换两数值
异或(exclusive OR)作为4种逻辑操作符之一,相对其他3种(OR/AND/NOT)来说,出场的次数非常少,是因为在日常开发中能用到它的场景本来就不多.对笔者来说,目前接触到场景只有交换两个数 ...
- 网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.
本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器 ...
- C语言:指针实现交换两个变量的值
用指针交换两个变量的值(10分) 题目内容: 用指针交换两个变量的值 主函数参考: int main( ) { int a,b; scanf("%d%d",&a,& ...
- 不用中间变量交换a 和b的值
// 不用中间变量的写法 ,假如 a=13, b=8; a=a+b =21; //此时 a=21; b=8; b=a-b=13; //此时a=21; b=13; a=a-b=8; //相当于 a=21 ...
- C语言中不用 + 和 - 求两个数之和
(二)解题 题目大意:不用+或者-实现两个整数的加法 解题思路:不用+或者-,就自然想到位运算,无非就是与或非来实现二进制的加法 首先,我们来看一位二进制的加法和异或运算 A B A&B A^ ...
- 不用中间变量交换a和b的值?
a = b = a = a+b b = a-b a = a-b print(a,b) a = b = a = a^b b = b^a a = a^b print(a,b) a = b = a,b = ...
- [转][C/C++] 怎样不用中间变量temp 实现两个数交换
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法. a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量 ...
随机推荐
- js设置随机切换背景图片
<script> var imgs =["http://images.cnblogs.com/cnblogs_com/xiaobo-Linux/1112236/o_2.jpg&q ...
- titlesplit源码
) UNSIGNED NOT NULL AUTO_INCREMENT, innserSessionid ), times ), channelType ), sourcetitle ), title ...
- Window.Open()方法详细的参数说明及技巧。
Window.Open()方法详细的参数说明及技巧. 一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法 ...
- 使用Fakes的Stub和Shim对ASP.NET MVC4进行单元测试
这是一篇导航文,不是翻译. MSDN对stub和shim的解释和使用场景演示:http://msdn.microsoft.com/en-us/library/hh549175.aspx 一个更详细的示 ...
- MongoDB数据直接转移
本方法较为暴力,有待验证,重要资料切勿使用.... 1.把一台电脑上MongoDB的--dbpath 下的文件夹 直接复制过来,放在新设备上 2.写个可爱的批处理文件 其实,就是改了个--dbpat ...
- 怎么用ABBYY在线浏览PDF文件
ABBYY FineReader 让您可以从在线存储服务中打开图像或 PDF 文件,并将已识别文本保存至在线存储服务中,如 Dropbox.SkyDrive 或 Google Drive 等.通过在 ...
- splash渲染网页
#coding=utf8 import requests,time,random import threadpool render_html = 'http://192.168.30.128:8050 ...
- 标准JSON格式定义与解析注意点
标准JSON格式定义与解析注意点 在JS.IOS.Android中都内置了JSON的序列化.反序列化SDK.JEE中也可以使用第三方的JSON解析库,如GSON.虽然在JSON格式被定义出来的时候并没 ...
- GDAL------加载Shapefile文件
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- swift开发之--代理协议的使用
swift代理的使用,和oc版本有区别,区别还是蛮大的,不过和oc一样都是用于反向传值: 实现如下: 1,声明两个类 2,实现流程,viewcontroller页面点击按钮进入firstVC页面,然后 ...