C#位运算符的基本用法
位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇体验位运算符在C#中的应用。主要包括:
○ 进制转换
※ 十进制转换成二进制
※ 二进制转换成十进制
○ | 按位或操作符
○ & 按位与操作符
○ ^ 按位异或操作符
※ 使用^按位异或交换2个数
※ 使用^按位异或进行加密运算
○ ~ 取反操作符
○ x << n 左移运算符
○ x >> n 右移运算符
进制转换
因为位运算是在二进制基础上进行的,所以进制转换是位运算的前提。
□ 十进制转换成二进制
比如,把10进制的数783转换成二进制,经过下面10个步骤。

把余数从下到上拼接起来,就是783的二进制,即1100001111。
在C#中,如果是Int16类型,意味着有16位整型数。对于783来说,如果表示成Int16类型,不足16位的话,要在前面补0,即要在1100001111补6个0,完整的表示是:0000001100001111。同样的道理,如果是Int32类型,意味着有32位整型数。
如何把-783转换成Int16类型的二进制呢?
→我们知道正数783表示成Int16类型的二进制是:0000001100001111
→在每个位置上倒转,即如果是1就变成0,反之亦然,倒转后变成:1111110011110000
→再加上1,变成:1111110011110001
□二进制转换成十进制
比如,把Int16类型的二进制数0000000100010110转换成十进制,经过下面的16个步骤。
从右向左,依次乘以2的n次方。
把所有的结果加起来:
0 + 2 + 4 + 0 + 16 + 0 + 0 + 0 + 256 + 0 = 2 + 4 + 16 + 256 = 278
所以,0000000100010110的十进制数是278。
如何把一个Int16类型的负二进制数转换成十进制呢?
比如有这样的一个二进制数:1111111111010011(Int16类型,第一位是数字1表示负数,第一位是数字0表示正数)
→每个位置上反转变成:0000000000101100
→进过计算,得到的十进制数是:44
→再加1,得到:45
→再变成负数,得到:-45
| 按位或操作符
假设,十进制数38和53进行按位或计算。
→经过计算,十进制数38的二进制表达是00100110,十进制数538的二进制表达是00110101。
→对| 按位或操作符来说,只要对应的二个二进位有一个为1时,结果就为1。
→把得到的00110111转换成十进制就是:55
如果用C#表示就是:
byte result = 38 | 53;
& 按位与操作符
假设,十进制数76和231进行按位与计算。
→经过计算,十进制数76的二进制表达是01001100,十进制数231的二进制表达是11100111。
→对& 按位与操作符来说,只要对应的二个二进位有一个为0时,结果就为0。
→把得到的 01000100转换成十进制就是:68
如果用C#表示就是:
byte result = 76 & 231;
^ 按位异或操作符
假设,十进制数138和43进行按位与计算。
→经过计算,十进制数138的二进制表达是10001010,十进制数43的二进制表达是00101011。
→对^ 按位异或操作符来说,当两对应的二进位相异时,结果为1。
→把得到的10100001转换成十进制就是:161
如果用C#表示就是:
byte result = 138 ^ 43 ;
□ 例子1:使用^ 按位异或交换2个数
int x = 4;int y = 6;x ^= y;y ^= x;x ^= y;Console.WriteLine(x); //6Console.WriteLine(y); //4
以上过程是这样的:
(1)x ^= y,相当于x = x ^ y
x的二进制是:00100
y的二进制是:00110
x和y进行异或,结果是:00010
x转换成十进制后,x为:2
(2)y ^= x,相当于y = y ^ x
y的二进制是:00110
x的二进制是:00010
y和x进行异或,结果是:00100
y转换成十进制后,y为:4
(3)x ^= y,相当于x = x ^ y
x的二进制是:00010
y的二进制是:00100
x和y进行异或,结果是:00110
x转换成十进制后,x为:6
□ 例子2:使用^按位异或进行加密运算
string msg = "这是我要加密的string字符串";string k = "mypassword";for(int i = 0; i < msg.Length; i++){sb.Append((char)(msg[i] ^ k[i % k.Length]));}Console.WriteLine(sb.ToString());
~ 取反操作符
假设,十进制数52进行取反计算。
→经过计算,十进制数52的二进制表达是00110100
→对~ 取反操作符来说,对应的二进位数按位求反,0变成1,1变成0
→把得到的11001011转换成十进制就是:203
如果用C#表示就是:
byte result = ~52;
x << n 左移运算符
每位向左移动n位,右边空缺的位置补0。
假设,十进制数154进行左移。
如果用C#表示就是:
byte b1 = 154;byte b2 = (byte)b1 << 1;Console.Writeline(b2);//结果是52,二进制是00110100
x >> n 右移运算符
每位向右移动n位,左边空缺的位置补0。
假设,十进制数155进行右移。
如果用C#表示就是:
byte b1 = 155;byte b2 = (byte)(b1 >> 1);Console.WriteLine(b2); // 结果: 77
总结:
| 按位或操作符来说,只要对应的二个二进位有一个为1时,结果就为1
& 按位与操作符来说,只要对应的二个二进位有一个为0时,结果就为0
^ 按位异或操作符来说,当两对应的二进位相异时,结果为1
~ 取反操作符来说,对应的二进位数按位求反,0变成1,1变成0
x << n 左移运算符,每位向左移动n位,右边空缺的位置补0
x >> n 右移运算符,每位向右移动n位,左边空缺的位置补0
参考资料:
Swapping of variables without Third Variable using XOR Logic
Understand how bitwise operators work
http://baike.baidu.com/view/9895739.htm?fr=aladdin
C#位运算符的基本用法的更多相关文章
- 位运算符的用法 ----非(!),与(&),或(|),异或(^)
位运算符的用法 ----非(!),与(&),或(|),异或(^) 三种运算符均针对二进制 非!:是一元运算符.对一个二进制的整数按位取反,输入0则输出1,输入1则输出0. 例: 0100 -( ...
- PHP中的运算符---位运算符、递增递减运算符、三元运算符、字符串运算符、数组运算符、类型运算符、错误控制运算符
1.位运算符 位运算符用来对整型数的指定位进行置位,如果被操作数是字符串,则对该字符串的ASCII码值进行操作. 运算类型 运算符 举例 结果 按位与 & $a & $b 将$a 与 ...
- ECMAScript 位运算符
位运算符是在数字底层(即表示数字的 32 个数位)进行操作的. 重温整数 ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript ...
- C/C++ 位运算符
C/C++位操作运算符 操作符 功能 用法 ~ 位求反 ~expr << 左移 expr1 << expr2 >> 右移 expr1 >> expr2 ...
- C语言--位运算符
一.位运算符 1.按位与:& 1> 功能 * 只有对应的两个二进制位为1时,结果位才为1,否则为0 * 举例:10用二进制表示为1010, 7用二进制表示为0111.对两个数值进行&a ...
- Javascript中的位运算符和技巧
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...
- js 位运算符
MDN定义:位运算符将它的操作数视为32位元的二进制串(0和1组成)而非十进制八进制或十六进制数. 例如:十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准 ...
- JavaScript位运算符
位运算符是在数字底层(即表示数字的 32 个数位)进行操作的. 重温整数 ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript ...
- Java基础-位运算符Bitwise Operators
Java基础-位运算符Bitwise Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算特点 位运算符分为按位与(&),按位或(|),按位异或(^ ...
随机推荐
- Codeforces 264B Good Sequences(DP+素数筛)
题目链接:http://codeforces.com/problemset/problem/264/B 题目大意:给出n个单调递增的数,让你找出最长的好序列,好序列是一种单调递增的并且相邻元素的最大公 ...
- HDU 1054 Strategic Game(最小路径覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题目大意:给你一棵树,选取树上最少的节点使得可以覆盖整棵树. 解题思路: 首先树肯定是二分图,因 ...
- 使用ngx_lua构建高并发应用
http://blog.csdn.net/chosen0ne/article/details/7304192
- 【洛谷】P2000 拯救世界
题解 小迪的blog : https://www.cnblogs.com/RabbitHu/p/9178645.html 请大家点推荐并在sigongzi的评论下面点支持谢谢! 掌握了小迪生成函数的有 ...
- sql developer连接mysql
刚刚安装sql developer之后,数据库连接时没有mysql的选项,需要增加一个jar包 mysql-connector-java-6.0.5.zip 工具--->首选项--->数据 ...
- poj1970 The Game(DFS)
题目链接 http://poj.org/problem?id=1970 思路 题目的意思是判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0. 这道 ...
- Python 爬虫个人记录(一)豆瓣电影250
一.爬虫环境 Python3.6 scrapy1.4 火狐浏览器 qq浏览器 二.scrapy shell 测试并获取 xpath 1.进入scrapy shell 2 .获取html fetch(' ...
- NOIP2018游记(更新完毕)
10.13 初赛 Day -1 考前 这一次的考场从暗♂德华兴改到了长沙市一中,一进去:我一看,考场在哪???这一中比长郡大了好多,而且连指示牌都没有,这时碰见了谢总,谢总告诉我们在第二教学楼.路上还 ...
- 用Python开始机器学习(3:数据拟合与广义线性回归)
机器学习中的预测问题通常分为2类:回归与分类. 简单的说回归就是预测数值,而分类是给数据打上标签归类. 本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析. 本例中使用一个 ...
- 第一次用python,成功的感觉不错。
自己的作业: 1. count = 0 while count <= 9 : count += 1 if count == 7 : continue print (count) 2. count ...