網(wǎng)站首頁 編程語言 正文
位運(yùn)算符包括:| 按位或 OR,& 按位與 AND,^ 按位異或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇體驗(yàn)位運(yùn)算符在C#中的應(yīng)用。
進(jìn)制轉(zhuǎn)換
因?yàn)槲贿\(yùn)算是在二進(jìn)制基礎(chǔ)上進(jìn)行的,所以進(jìn)制轉(zhuǎn)換是位運(yùn)算的前提。
十進(jìn)制轉(zhuǎn)換成二進(jìn)制
比如,把10進(jìn)制的數(shù)783轉(zhuǎn)換成二進(jìn)制,經(jīng)過下面10個(gè)步驟。
把余數(shù)從下到上拼接起來,就是783的二進(jìn)制,即1100001111。
在C#中,如果是Int16類型,意味著有16位整型數(shù)。對(duì)于783來說,如果表示成Int16類型,不足16位的話,要在前面補(bǔ)0,即要在1100001111補(bǔ)6個(gè)0,完整的表示是:0000001100001111。同樣的道理,如果是Int32類型,意味著有32位整型數(shù)。
如何把-783轉(zhuǎn)換成Int16類型的二進(jìn)制呢?
→我們知道正數(shù)783表示成Int16類型的二進(jìn)制是:0000001100001111
→在每個(gè)位置上倒轉(zhuǎn),即如果是1就變成0,反之亦然,倒轉(zhuǎn)后變成:1111110011110000
→再加上1,變成:1111110011110001
二進(jìn)制轉(zhuǎn)換成十進(jìn)制
比如,把Int16類型的二進(jìn)制數(shù)0000000100010110轉(zhuǎn)換成十進(jìn)制,經(jīng)過下面的16個(gè)步驟。
從右向左,依次乘以2的n次方。
把所有的結(jié)果加起來:
0 + 2 + 4 + 0 + 16 + 0 + 0 + 0 + 256 + 0 = 2 + 4 + 16 + 256 = 278
所以,0000000100010110的十進(jìn)制數(shù)是278。
如何把一個(gè)Int16類型的負(fù)二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制呢?
比如有這樣的一個(gè)二進(jìn)制數(shù):1111111111010011(Int16類型,第一位是數(shù)字1表示負(fù)數(shù),第一位是數(shù)字0表示正數(shù))
→每個(gè)位置上反轉(zhuǎn)變成:0000000000101100
→進(jìn)過計(jì)算,得到的十進(jìn)制數(shù)是:44
→再加1,得到:45
→再變成負(fù)數(shù),得到:-45
| 按位或操作符
假設(shè),十進(jìn)制數(shù)38和53進(jìn)行按位或計(jì)算。
→經(jīng)過計(jì)算,十進(jìn)制數(shù)38的二進(jìn)制表達(dá)是00100110,十進(jìn)制數(shù)538的二進(jìn)制表達(dá)是00110101。
→對(duì)| 按位或操作符來說,只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果就為1。
→把得到的00110111轉(zhuǎn)換成十進(jìn)制就是:55
如果用C#表示就是:
byte result = 38 | 53;
& 按位與操作符
假設(shè),十進(jìn)制數(shù)76和231進(jìn)行按位與計(jì)算。
→經(jīng)過計(jì)算,十進(jìn)制數(shù)76的二進(jìn)制表達(dá)是01001100,十進(jìn)制數(shù)231的二進(jìn)制表達(dá)是11100111。
→對(duì)& 按位與操作符來說,只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為0時(shí),結(jié)果就為0。
→把得到的 01000100轉(zhuǎn)換成十進(jìn)制就是:68
如果用C#表示就是:
byte result = 76 & 231;
^ 按位異或操作符
假設(shè),十進(jìn)制數(shù)138和43進(jìn)行按位與計(jì)算。
→經(jīng)過計(jì)算,十進(jìn)制數(shù)138的二進(jìn)制表達(dá)是10001010,十進(jìn)制數(shù)43的二進(jìn)制表達(dá)是00101011。
→對(duì)^ 按位異或操作符來說,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。
→把得到的10100001轉(zhuǎn)換成十進(jìn)制就是:161
如果用C#表示就是:
byte result = 138 ^ 43 ;
例子1:使用^ 按位異或交換2個(gè)數(shù)
int x = 4;
int y = 6;
x ^= y;
y ^= x;
x ^= y;
Console.WriteLine(x); //6
Console.WriteLine(y); //4
以上過程是這樣的:
(1)x ^= y,相當(dāng)于x = x ^ y
x的二進(jìn)制是:00100
y的二進(jìn)制是:00110
x和y進(jìn)行異或,結(jié)果是:00010
x轉(zhuǎn)換成十進(jìn)制后,x為:2
(2)y ^= x,相當(dāng)于y = y ^ x
y的二進(jìn)制是:00110
x的二進(jìn)制是:00010
y和x進(jìn)行異或,結(jié)果是:00100
y轉(zhuǎn)換成十進(jìn)制后,y為:4
(3)x ^= y,相當(dāng)于x = x ^ y
x的二進(jìn)制是:00010
y的二進(jìn)制是:00100
x和y進(jìn)行異或,結(jié)果是:00110
x轉(zhuǎn)換成十進(jìn)制后,x為:6
例子2:使用^按位異或進(jìn)行加密運(yùn)算
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());
~ 取反操作符
假設(shè),十進(jìn)制數(shù)52進(jìn)行取反計(jì)算。
→經(jīng)過計(jì)算,十進(jìn)制數(shù)52的二進(jìn)制表達(dá)是00110100
→對(duì)~ 取反操作符來說,對(duì)應(yīng)的二進(jìn)位數(shù)按位求反,0變成1,1變成0
→把得到的11001011轉(zhuǎn)換成十進(jìn)制就是:203
如果用C#表示就是:
byte result = ~52;
x << n 左移運(yùn)算符
每位向左移動(dòng)n位,右邊空缺的位置補(bǔ)0。
假設(shè),十進(jìn)制數(shù)154進(jìn)行左移。
如果用C#表示就是:
byte b1 = 154;
byte b2 = (byte)b1 << 1;
Console.Writeline(b2);//結(jié)果是52,二進(jìn)制是00110100
x >> n 右移運(yùn)算符
每位向右移動(dòng)n位,左邊空缺的位置補(bǔ)0。
假設(shè),十進(jìn)制數(shù)155進(jìn)行右移。
如果用C#表示就是:
byte b1 = 155;
byte b2 = (byte)(b1 >> 1);
Console.WriteLine(b2); // 結(jié)果: 77
總結(jié):
| 按位或操作符來說,只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果就為1
& 按位與操作符來說,只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為0時(shí),結(jié)果就為0
^ 按位異或操作符來說,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1
~ 取反操作符來說,對(duì)應(yīng)的二進(jìn)位數(shù)按位求反,0變成1,1變成0
x << n 左移運(yùn)算符,每位向左移動(dòng)n位,右邊空缺的位置補(bǔ)0
x >> n 右移運(yùn)算符,每位向右移動(dòng)n位,左邊空缺的位置補(bǔ)0
原文鏈接:https://www.cnblogs.com/darrenji/p/3921183.html
相關(guān)推薦
- 2022-06-20 C語言詳解如何實(shí)現(xiàn)順序棧_C 語言
- 2022-04-15 C語言各種操作符透徹理解上篇_C 語言
- 2022-09-20 ?C++模板template原理解析_C 語言
- 2022-06-06 flutter 創(chuàng)建項(xiàng)目、運(yùn)行項(xiàng)目、項(xiàng)目目錄
- 2022-07-03 C#并行編程之PLINQ(并行LINQ)_C#教程
- 2022-05-06 嵌入式C語言輕量級(jí)程序架構(gòu)內(nèi)核編寫_C 語言
- 2023-02-15 Python+Tkinter實(shí)現(xiàn)RGB數(shù)值轉(zhuǎn)換為16進(jìn)制碼_python
- 2022-12-03 FFmpeg?Principle分析Out?put?File?數(shù)據(jù)結(jié)構(gòu)_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支