主頁(yè) > 知識(shí)庫(kù) > Golang 運(yùn)算符及位運(yùn)算詳解

Golang 運(yùn)算符及位運(yùn)算詳解

熱門(mén)標(biāo)簽:百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化 呼叫中心市場(chǎng)需求 服務(wù)外包 地方門(mén)戶網(wǎng)站 Linux服務(wù)器 AI電銷 鐵路電話系統(tǒng)

什么是運(yùn)算符?

運(yùn)算符用于執(zhí)行程序代碼運(yùn)算,會(huì)針對(duì)一個(gè)以上操作數(shù)項(xiàng)目來(lái)進(jìn)行運(yùn)算。例如:2+3,其操作數(shù)是2和3,而運(yùn)算符則是“+”。

在vb2005中運(yùn)算符大致可以分為5種類型:算術(shù)運(yùn)算符、位運(yùn)算符、 關(guān)系運(yùn)算符、賦值運(yùn)算符、邏輯運(yùn)算符。

算數(shù)運(yùn)算符

運(yùn)算符 描述
+ 相加
- 相減
* 相乘
/ 相除
% 求余

注意: ++(自增)和--(自減)在Go語(yǔ)言中是單獨(dú)的語(yǔ)句,并不是運(yùn)算符。

func main() {
 a, b := 3,4
 fmt.Printf("a 加 b = %d\n", a + b)
 fmt.Printf("a 減 b = %d\n", a - b)
 fmt.Printf("a 乘 b = %d\n", a * b)
 fmt.Printf("a 除 b = %d\n", a / b)
}

關(guān)系運(yùn)算符

運(yùn)算符 描述
== 檢查兩個(gè)值是否相等,如果相等返回 True 否則返回 False。
!= 檢查兩個(gè)值是否不相等,如果不相等返回 True 否則返回 False。
> 檢查左邊值是否大于右邊值,如果是返回 True 否則返回 False。
>= 檢查左邊值是否大于等于右邊值,如果是返回 True 否則返回 False。
檢查左邊值是否小于右邊值,如果是返回 True 否則返回 False。
= 檢查左邊值是否小于等于右邊值,如果是返回 True 否則返回 False。
package main
import "fmt"
func main() {
	a, b := 3, 4
	//fmt.Println("a == b?", a == b)  // a == b? false
	//fmt.Println("a != b?", a != b)  // a != b? true
	//fmt.Println("a > b?", a > b )  // a > b? true
	//fmt.Println("a >= b?", a >= b)  // a >= b? false
	//fmt.Println("a  b?", a  b )  // a >= b? true
	//fmt.Println("a = b?", a = b ) // a = b? true
}

邏輯運(yùn)算符

運(yùn)算符 描述
邏輯 AND 運(yùn)算符。 如果兩邊的操作數(shù)都是 True,則為 True,否則為 False。
|| 邏輯 OR 運(yùn)算符。 如果兩邊的操作數(shù)有一個(gè) True,則為 True,否則為 False。
! 邏輯 NOT 運(yùn)算符。 如果條件為 True,則為 False,否則為 True。
package main
import "fmt"
func main() {
	a, b := true, false
	fmt.Println("a  b ?", a  b) // a  b ? false
	fmt.Println("a || b ?", a || b) // a || b ? true
	fmt.Println(" !a ?", !a)  // !a ? false
	fmt.Println(" !b ?", !b)  // !b ? true
}

位運(yùn)算符

常見(jiàn)進(jìn)制:

二進(jìn)制:只有 0 和 1,Go語(yǔ)言中不能直接使用二進(jìn)制表示整數(shù);

八進(jìn)制:0-7,以數(shù)字 0 開(kāi)頭;

十進(jìn)制:0-9;

十六進(jìn)制:0-9 以及 A-F,以 0X 開(kāi)頭,A-F 以及 X 不區(qū)分大小寫(xiě)。

package main
import "fmt"
func main() {
 a := 10
 // 二進(jìn)制
 fmt.Printf("%b\n",a) // 1010
 // 八進(jìn)制
 fmt.Printf("%o\n",a) // 12
 // 十進(jìn)制
 fmt.Printf("%d\n",a) // 10
 // 十六進(jìn)制
 fmt.Printf("%x\n",a) // a
}

任意進(jìn)制轉(zhuǎn)換為十進(jìn)制

二進(jìn)制轉(zhuǎn)十進(jìn)制:從最低位開(kāi)始,每個(gè)位上數(shù)乘以 2 的位數(shù)減 1 次方然后求和。

1011 = 120 + 121 + 022 + 123 = 11

八進(jìn)制轉(zhuǎn)十進(jìn)制:從最低位開(kāi)始,每個(gè)位上數(shù)乘以 8 的位數(shù)減 1 次方然后求和。

0123 = 380 + 281 + 182 + 083 = 83

其他進(jìn)制互轉(zhuǎn):

二進(jìn)制轉(zhuǎn)換八進(jìn)制:將二進(jìn)制數(shù)從低位開(kāi)始,每三位一組,轉(zhuǎn)換成八進(jìn)制數(shù)即可;

二進(jìn)制轉(zhuǎn)十六進(jìn)制:將二進(jìn)制數(shù)從低位開(kāi)始,每四位一組,轉(zhuǎn)換成十六進(jìn)制數(shù)即可;

八進(jìn)制轉(zhuǎn)換二進(jìn)制:將八進(jìn)制數(shù)每 1 位轉(zhuǎn)換成一個(gè) 3 位的二進(jìn)制數(shù)(首位 0 除外);

十六進(jìn)制轉(zhuǎn)二進(jìn)制:將十六進(jìn)制每 1 位轉(zhuǎn)換成對(duì)應(yīng)的一個(gè) 4 位的二進(jìn)制數(shù)即可。

反碼補(bǔ)碼

對(duì)于有符號(hào)數(shù)而言,二進(jìn)制的最高為是符號(hào)位:0 表示正數(shù),1 表示負(fù)數(shù)。

短除法進(jìn)行進(jìn)制轉(zhuǎn)變

十進(jìn)制的10-> 二進(jìn)制:

二進(jìn)制的1011 -> 十進(jìn)制

想要詳細(xì)了解其原理的可以參考短除法相關(guān)說(shuō)明

位運(yùn)算符對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作。

運(yùn)算符 描述
參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相與。 (兩位均為1才為1)
| 參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相或。 (兩位有一個(gè)為1就為1)
^ 參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相異或,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。 (兩位不一樣則為1)
左移n位就是乘以2的n次方。 “ab”是把a(bǔ)的各二進(jìn)位全部左移b位,高位丟棄,低位補(bǔ)0。
>> 右移n位就是除以2的n次方。 “a>>b”是把a(bǔ)的各二進(jìn)位全部右移b位。

XOR - 異或:相同為0,不同為1.也可用“進(jìn)位加法”來(lái)理解

x ^ 0 = X
x ^ 1s = ~x # 1s = ~ 0
x ^ (~x) = 1s 
x ^ x = 0
c = a ^ b => a ^ c = b, b ^c = a # 交換兩數(shù)
a ^ b ^ c = a ^(b ^ c) = (a ^ b) ^c # associative
// 指定未知的位運(yùn)算
. 將x最右邊的n位請(qǐng)零: x  (~0  n )
. 獲取x的第n位值(0 或 1): (x >> n) 1
. 獲取x的第n位的冪值:x  (1  n)
. 僅將第n位置為 1: x | (1  n)
. 僅將第n位置為0:x  (~1(1  n))
. 將x最高位至第n位(含)清零:x  ((1  n) - 1)
// 實(shí)戰(zhàn)位運(yùn)算要點(diǎn)
// 判斷奇偶性
x % 2 == 1 - > (x  1) == 1 
x  2 == 0 -> (x1) == 0
 // 清零最低位的1
x = x  (x - 1)
// 得到最低位的1
x  ~x 
x  ~ x = > 0

為了更清晰的觀察其變化,我們使用二進(jìn)制來(lái)進(jìn)行演示

package main
import "fmt"
func main() {
 a, b := 13, 21
 fmt.Printf("a:%b  %b = %b\n", a, b, a  b)
 fmt.Printf("a:%b | %b = %b\n", a, b, a | b)
 fmt.Printf("a:%b ^ %b = %b\n", a, b, a ^ b)
 fmt.Printf("a:%b ^ %b = %b\n", a, b, a ^ b)
 // 左移
 // 二進(jìn)制表示
 fmt.Printf("%b  %b = %b\n",2, 2, 22) // 10  10 = 1000
 // 十進(jìn)制
 fmt.Printf("%d  %d = %d\n",2, 2, 22) // 2  2 = 8
 // 右移
 // 二進(jìn)制
 fmt.Printf("%b >> %b = %b\n",2, 2, 2>>2) // 10 >> 10 = 0
 // 十進(jìn)制
 fmt.Printf("%d >> %d = %d\n",2, 2, 2>>2) // 2 >> 2 = 0
}

賦值運(yùn)算符

運(yùn)算符 描述
= 簡(jiǎn)單的賦值運(yùn)算符,將一個(gè)表達(dá)式的值賦給一個(gè)左值
+= 相加后再賦值
-= 相減后再賦值
*= 相乘后再賦值
/= 相除后再賦值
%= 求余后再賦值
= 左移后賦值
>>= 右移后賦值
= 按位與后賦值
|= 按位或后賦值
^= 按位異或后賦值

運(yùn)算符優(yōu)先級(jí)

運(yùn)算符優(yōu)先級(jí)確定表達(dá)式中的分組。這會(huì)影響表達(dá)式的計(jì)算方式。某些運(yùn)算符比其他運(yùn)算符具有更高的優(yōu)先級(jí); 例如,乘法運(yùn)算符比加法運(yùn)算符有更高的優(yōu)先級(jí)。

當(dāng)同級(jí)別的運(yùn)算符出現(xiàn)在同一個(gè)表達(dá)式中,從左到右的順序計(jì)算,比如乘除一起,不管是乘在前面還是除在前面都是從左到右計(jì)算乘、除運(yùn)算符。加減亦是如此。

例如:x = 7 + 3 * 2; 這里,計(jì)算結(jié)果x被分配13,而不是20,因?yàn)檫\(yùn)算符 *具有比+有更的優(yōu)先級(jí),所以它首先乘以3 * 2,然后加上7。

這里,具有最高優(yōu)先級(jí)的運(yùn)算符放在表的頂部,具有最低優(yōu)先級(jí)的運(yùn)算符出現(xiàn)在底部。 在表達(dá)式中,將首先計(jì)算較高優(yōu)先級(jí)運(yùn)算符。

分類 描述 關(guān)聯(lián)性
后綴 ()[]->.++ – 左到右
一元 + -!~++ --(type)*sizeof 右到左
乘法 */ % 左到右
加法 + - 左到右
移位 >> 左到右
關(guān)系 =>>= 左到右
相等 ==!= 左到右
按位AND 左到右
按位XOR ^ 左到右
按位OR | 左到右
邏輯AND 左到右
邏輯OR || 左到右
條件 ?: 右到左
分配 =+=-=*=/= %=>>= = = ^= |= 右到左
逗號(hào) , 左到右

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang中為什么不存在三元運(yùn)算符詳解
  • Go語(yǔ)言運(yùn)算符案例講解
  • 手把手帶你走進(jìn)Go語(yǔ)言之運(yùn)算符解析

標(biāo)簽:湘潭 蘭州 仙桃 黃山 湖南 衡水 崇左 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang 運(yùn)算符及位運(yùn)算詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266