C#位运算讲解与示例
2016-06-10 15:49
429 查看
二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1 (逻辑非)
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//无符号x,y比较
x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较
在C#中我们可以这样交换两个数的值。从而不用我们常常使用的借助第三个变量来达到交换的目的
static void Swap(ref int a, ref int b) { a ^= b; Console.WriteLine(a); b ^= a; Console.WriteLine(b); a ^= b; Console.WriteLine(a); Console.WriteLine(b); }
应用举例
(1) 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 将int型变量a的第k位清0,即a=a&~(1<
static int average(int x, int y) //返回X,Y 的平均值 { return (x&y)+((x^y)>>1); }
(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
static boolean power2(int x) { return ((x&(x-1))==0)&&(x!=0); }
(9)计算绝对值
static int abs(int x) { int y; y = x >> 31; return (x ^ y) - y; //or: (x+y)^y }
(10)取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a & (2^n - 1)
(11)乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a<< n
(12)除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 a>> n
例: 12/8 == 12>>3
(13) a % 2 等价于 a & 1
(14) if (x == a) x= b;
else x= a;
等价于 x= a ^ b ^ x;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wei
{
class Program
{
static void Main(string[] args)
{
//逻辑与
Console.WriteLine(8 & 9);
//逻辑或 结果是8
Console.WriteLine(8 | 9);
//逻辑非 结果是9
Console.WriteLine(~85);
//逻辑异或 结果是-86
Console.WriteLine(8 ^ 9);
/*
* 0000 1111
* 0111 1000
*/
//位左移 结果是120
Console.WriteLine(15 << 3);
/*
* 0000 1111
* 0000 0001
*/
//位右移 结果相当于是15/8
Console.WriteLine(15 >> 3);
Console.WriteLine("******************************");
int value1 = 1;
int value2 = 15;
Swap(ref value1, ref value2);
Console.WriteLine("交换后的值{0},{1}",value1,value2);
Console.WriteLine(abs(-25));
Console.ReadLine();
}
static void Swap(ref int a, ref int b)
{
a ^= b;
Console.WriteLine(a);
b ^= a;
Console.WriteLine(b);
a ^= b;
Console.WriteLine(a);
Console.WriteLine(b);
}
static int abs(int x) { int y; y = x >> 31; return (x ^ y) - y; //or: (x+y)^y }
}
}
相关文章推荐
- C#远程时间同步助手软件设计
- C#远程时间同步助手软件设计
- C#中静态变量的初始化
- C#使用反射加载多个程序集的实现方法
- C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)
- C#编程之接口
- C# winform ComboBox绑定数据源时触发SelectedIndexChanged事件的处理
- C# 7.0 新特性1: 基于Tuple的“多”返回值方法
- C#设计模式—抽象工厂模式
- C#—绘制图形
- 备忘录模式
- 建造者模式
- C# 数据类型
- VS2008 C# 开发ActiveX控件总结
- 外观模式
- TemplateText TT 在Runtime发生 Could not load type ...... because the format is invalid
- C#—图形图像编程基础
- 原型模式深复制浅复制
- C#日记——正则表达式(以检测邮箱和手机号格式为例)
- 代理模式