搜尋
首頁後端開發Golang一文詳解Golang中的位元操作
一文詳解Golang中的位元操作Sep 21, 2022 am 11:09 AM
gogolang

本篇文章帶大家深入了解下Golang中的位元操作,介紹一下詳述每個操作符以及它們如何使用的案例,希望對大家有所幫助!

一文詳解Golang中的位元操作

在電腦記憶體昂貴,處理能力有限的美好舊時光裡,用比較黑客範的位元運算方式去處理資訊是首選方式(某些情況下只能如此)。時至今日,直接使用位元運算仍然是許多計算領域中不可或缺的部分,例如底層系統編程,圖形處理,密碼學等。 【相關推薦:Go影片教學

Go 程式語言支援以下位元運算子:

&   bitwise AND
 |   bitwise OR
 ^   bitwise XOR
&^   AND NOT
>   right shift

本文的餘下部分詳述了每個運算子以及它們如何使用的案例。

& 運算子

在Go 中,  & 運算子在兩個整數運算元中執行按位元AND 操作。 AND 運算具有以下屬性:

Given operands a, b
AND(a, b) = 1; only if a = b = 1
               else = 0

AND 運算子具有選擇性的把整數資料的位元清除為 0 的好的效果。例如,我們可以使用  & 運算子去清除(設定)最後 4 個最低有效位元(LSB)全部為 0 。

func main() {
    var x uint8 = 0xAC    // x = 10101100
    x = x & 0xF0          // x = 10100000
}

所有的位元運算都支援簡寫的賦值形式。例如,前面的例子可以改寫為如下。

func main() {
    var x uint8 = 0xAC    // x = 10101100
    x &= 0xF0             // x = 10100000
}

另一個巧妙的技巧是:你可以用 & 運算去測試一個數字是奇數還是偶數。原因是當一個數字的二進制的最低位是 1 的時候,那他就是奇數。我們可以用一個數字和1 進行& 操作,然後在和1 做AND 運算,如果的到的結果是1 ,那麼這個原始的數字就是奇數

import (
    "fmt"
    "math/rand"
)
func main() {
    for x := 0; x  <p>在 <a href="https://play.golang.org/p/2mTNOtioNM" target="_blank">Playground</a>  上執行上面的範例</p><h4>
<span class="header-link octicon octicon-link"></span><strong>| 運算子</strong>
</h4><p>##|<code>#對其整數運算元執行位元</code>或<code>操作。回想一下</code>或<code>運算子具備以下性質:</code></p><pre class="brush:php;toolbar:false">Given operands a, b
OR(a, b) = 1; when a = 1 or b = 1
              else = 0
我們可以利用位元

運算子為給定的整數選擇性地設定單一位元。例如,在下列範例中我們使用位元將範例數(從低位元到高位元(MSB))中的第 3 ,第 7 和第 8 位置為 1 。

func main() {
    var a uint8 = 0
    a |= 196
    fmt.Printf("%b", a)
}

// 打印结果  11000100
            ^^   ^

練習場中可運行範例。

在使用位元遮罩技術為給定的整數數字設定任意位元時,

運算非常有用。例如,我們可以擴充先前的程式為變數 a 儲存的值設定更多的位元。

func main() {
    var a uint8 = 0
    a |= 196
    a |= 3
    fmt.Printf("%b", a)
}

// 打印结果 11000111

練習場中可以運行範例。

在前面的程式裡,不僅要按位元設定十進位的 196,而且要設定低位元上的十進位 3。我們也可以繼續(

上更多的值)設定完所有的位元。

位元運算的配置用法

現在,回顧一下

AND(a, 1) = a 當且僅當a = 1。我們可以利用這個特性去查詢其設定位的值。例如,在上述程式碼中 a & 196 會回傳 196 是因為這幾位的值在 a 中確實都存在。所以我們可以結合使用 OR 和  AND 運算的方式來分別設定和讀取某位的配置值。 .

接下來的原始碼片段示範了這個操作。函數

procstr 會轉換字串的內容。它需要兩個參數:第一個, str,是將要轉換的字串,第二個, conf,是一個使用位元遮罩的方式指定多重轉換配置的整數。

const (
    UPPER  = 1 // 大写字符串
    LOWER  = 2 // 小写字符串
    CAP    = 4 // 字符串单词首字母大写
    REV    = 8 // 反转字符串
)

func main() {
    fmt.Println(procstr("HELLO PEOPLE!", LOWER|REV|CAP))
}

func procstr(str string, conf byte) string {
    // 反转字符串
    rev := func(s string) string {
        runes := []rune(s)
        n := len(runes)
        for i := 0; i 在Playground上面運行程式碼.<p></p>上面的<p>procstr("HELLO PEOPLE!", LOWER|REV|CAP)<code> 方法會把字串變成小寫,然後反轉字串,最後把字串裡面的單字縮寫變成大寫。這個功能是透過設定 </code>conf<code> 裡的第二,三,四位的值為 14 來完成的。然後程式碼使用連續的 if 語句區塊來取得這些位元操作進行對應的字串轉換。 </code></p><h4>
<span class="header-link octicon octicon-link"></span>^ 運算子<strong></strong>
</h4>在Go 中 位元<p>異或<code> 運算子是用</code>^<code>來表示的。 </code>異或<code>運算子有如下的特點:</code></p><pre class="brush:php;toolbar:false">Given operands a, b
XOR(a, b) = 1; only if a != b
     else = 0

異或運算的這個特性可以用來把二進位位元的一個值變成另外一個值。舉個例子,給到一個 16 進制的值,我們可以使用以下程式碼切換前8位(從 MSB 開始)的值。

func main() {
    var a uint16 = 0xCEFF
    a ^= 0xFF00 // same a = a ^ 0xFF00
}

// a = 0xCEFF   (11001110 11111111)
// a ^=0xFF00   (00110001 11111111)

在前面的代码片段中,与 1 进行异或的位被翻转(从 0 到 1 或从 1 到  0)。异或 运算的一个实际用途,例如,可以利用 异或运算去比较两个数字的符号是否一样。当 (a ^ b) ≥ 0 (或相反符号的 (a ^ b) )为 <code>true 的时候,两个整数 a,b 具有相同的符号,如下面的程序所示:

func main() {
    a, b := -12, 25
    fmt.Println(&amp;amp;amp;quot;a and b have same sign?&amp;amp;amp;quot;, (a ^ b) &amp;amp;amp;gt;= 0)
}

在 Go 的 Playground运行代码。

当执行上面这个程序的时候,将会打印出:a and b have same sign? false。在 Go Playground 上修改程序里 a ,b 的符号,以便看到不同的结果。

^ 作为取反位运算符 (非)

不像其他语言 (c/c++,Java,Python,Javascript,等), Go 没有专门的一元取反位运算符。取而代之的是,XOR 运算符 ^,也可作为一元取反运算符作用于一个数字。对于给定位 x,在 Go 中 x = 1 ^ x 可以翻转该位。在以下的代码段中我们可以看到使用 ^a 获取变量 a 的取反值的操作。

func main() {
    var a byte = 0x0F
    fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a)
    fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, ^a)
}

// 打印结果
00001111     // var a
11110000     // ^a

练习场中可以运行范例。

&amp;amp;amp;^ 操作符

&amp;amp;amp;^ 操作符意为 与非,是 操作符的简写形式,它们定义如下。

Given operands a, b
AND_NOT(a, b) = AND(a, NOT(b))

如果第二个操作数为 1 那么它则具有清除第一个操作数中的位的趣味特性。

AND_NOT(a, 1) = 0; clears a
AND_NOT(a, 0) = a;

接下来的代码片段使用 AND NOT 操作符,将变量值1010 1011变为 1010 0000,清除了操作数上的低四位。

func main() {
    var a byte = 0xAB
     fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a)
     a &amp;amp;amp;amp;^= 0x0F
     fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a)
}

// 打印:
10101011
10100000

练习场中运行范例。

> 操作符

与其他 C 的衍生语言类似, Go 使用 和 <code>>> 来表示左移运算符和右移运算符,如下所示:

Given integer operands a and n,
a &amp;amp;amp;gt; n; shifts all bits in a to the right n times

例如,在下面的代码片段中变量 a00000011)的值将会左移位运算符分别移动三次。每次输出结果都是为了说明左移的目的。

func main() {
    var a int8 = 3
    fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a)
    fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a&amp;amp;amp;lt;p&amp;amp;amp;gt;在 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://play.golang.org/p/_lhE8OoZxY&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;Playground&amp;amp;amp;lt;/a&amp;amp;amp;gt; 运行代码&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;注意每次移动都会将低位右侧补零。相对应,使用右移位操作符进行运算时,每个位均向右方移动,空出的高位补零,如下示例 (有符号数除外,参考下面的算术移位注释)。&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=&amp;amp;amp;quot;brush:php;toolbar:false&amp;amp;amp;quot;&amp;amp;amp;gt;func main() {
 var a uint8 = 120
 fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a)
 fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a&amp;amp;amp;gt;&amp;amp;amp;gt;1)
 fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a&amp;amp;amp;gt;&amp;amp;amp;gt;2)
}

// 打印:
01111000
00111100
00011110

练习场中可以运行范例。

可以利用左移和右移运算中,每次移动都表示一个数的 2 次幂这个特性,来作为某些乘法和除法运算的小技巧。例如,如下代码中,我们可以使用右移运算将 200(存储在变量 a 中)除以 2 。

func main() {
    a := 200
    fmt.Printf(&amp;amp;amp;quot;%d\n&amp;amp;amp;quot;, a&amp;amp;amp;gt;&amp;amp;amp;gt;1)
}

// 打印:
100

练习场 中可以运行范例。

或是通过左移 2 位,将一个数乘以4:

func main() {
    a := 12
    fmt.Printf(&amp;amp;amp;quot;%d\n&amp;amp;amp;quot;, a&amp;amp;amp;lt;p&amp;amp;amp;gt;在 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://play.golang.org/p/xuJRcKgMVV&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;练习场&amp;amp;amp;lt;/a&amp;amp;amp;gt; 中可以运行范例。&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;位移运算符提供了有趣的方式处理二进制值中特定位置的值。例如,下列的代码中,&amp;amp;amp;lt;code&amp;amp;amp;gt;|&amp;amp;amp;lt;/code&amp;amp;amp;gt; 和 &amp;amp;amp;lt;code&amp;amp;amp;gt; 用于设置变量 &amp;amp;amp;lt;code&amp;amp;amp;gt;a&amp;amp;amp;lt;/code&amp;amp;amp;gt; 的第三个 bit 位。&amp;amp;amp;lt;/code&amp;amp;amp;gt;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=&amp;amp;amp;quot;brush:php;toolbar:false&amp;amp;amp;quot;&amp;amp;amp;gt;func main() {
    var a int8 = 8
    fmt.Printf(&amp;amp;amp;quot;%08b\n&amp;amp;amp;quot;, a)
    a = a | (1&amp;amp;amp;lt;p&amp;amp;amp;gt;可以在 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://play.golang.org/p/h7WoP7ieuI&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;练习场&amp;amp;amp;lt;/a&amp;amp;amp;gt; 中运行代码示例。&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;或者,您可以组合位移运算符和 &amp;amp;amp;lt;code&amp;amp;amp;gt;&amp;amp;amp;amp;&amp;amp;amp;lt;/code&amp;amp;amp;gt; 测试是否设置了第n位,如下面示例所示:&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=&amp;amp;amp;quot;brush:php;toolbar:false&amp;amp;amp;quot;&amp;amp;amp;gt;func main() {
    var a int8 = 12
    if a&amp;amp;amp;amp;(1&amp;amp;amp;lt;p&amp;amp;amp;gt;在 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://play.golang.org/p/Ptc7Txk5Jb&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;练习场&amp;amp;amp;lt;/a&amp;amp;amp;gt;中运行代码。&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;使用  &amp;amp;amp;lt;code&amp;amp;amp;gt;&amp;amp;amp;amp;^&amp;amp;amp;lt;/code&amp;amp;amp;gt; 和位移运算符,我们可以取消设置一个值的某个位。例如,下面的示例将变量 a 的第三位置为 0 :&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;pre class=&amp;amp;amp;quot;brush:php;toolbar:false&amp;amp;amp;quot;&amp;amp;amp;gt;func main() {
    var a int8 = 13 
    fmt.Printf(&amp;amp;amp;quot;%04b\n&amp;amp;amp;quot;, a)
    a = a &amp;amp;amp;amp;^ (1 &amp;amp;amp;lt;p&amp;amp;amp;gt;在 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://play.golang.org/p/Stjq9oOjKz&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;练习场&amp;amp;amp;lt;/a&amp;amp;amp;gt; 中运行代码。&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;h4&amp;amp;amp;gt;
&amp;amp;amp;lt;span class=&amp;amp;amp;quot;header-link octicon octicon-link&amp;amp;amp;quot;&amp;amp;amp;gt;&amp;amp;amp;lt;/span&amp;amp;amp;gt;&amp;amp;amp;lt;strong&amp;amp;amp;gt;关于算术位移运算的笔记&amp;amp;amp;lt;/strong&amp;amp;amp;gt;
&amp;amp;amp;lt;/h4&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;当要位移的值(左操作数)是有符号值时,Go 自动应用算术位移。在右移操作期间,复制(或扩展)二进制补码符号位以填充位移的空隙。&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;h4&amp;amp;amp;gt;
&amp;amp;amp;lt;span class=&amp;amp;amp;quot;header-link octicon octicon-link&amp;amp;amp;quot;&amp;amp;amp;gt;&amp;amp;amp;lt;/span&amp;amp;amp;gt;&amp;amp;amp;lt;strong&amp;amp;amp;gt;總結&amp;amp;amp;lt;/strong&amp;amp;amp;gt;
&amp;amp;amp;lt;/h4&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;與其它現代運算子一樣,Go 支援所有二進位位元運算子。這篇文章僅僅提供了可以用這些操作符完成的各種黑科技範例。你可以在網路上找到很多文章,特別是 Sean Eron Anderson 寫的 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://graphics.stanford.edu/~seander/bithacks.html&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;Bit Twiddling Hacks&amp;amp;amp;lt;/a&amp;amp;amp;gt; 。 &amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;追蹤 Vladim &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://twitter.com/VladimirVivien&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;@vladimirvivien&amp;amp;amp;lt;/a&amp;amp;amp;gt; 的 Twitter。 &amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;如果你正在學習 Go,閱讀  Vladimir Vivien 關於 Go 的書,名為 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://www.packtpub.com/application-development/learning-go-programming&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;Learning Go Programming&amp;amp;amp;lt;/a&amp;amp;amp;gt; 。 &amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;這篇文章開始由作者 Vladimir Vivien 發佈在 Medium 上,名為 &amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://medium.com/learning-the-go-programming-language/bit-hacking-with-go-e0acee258827#.2hof13ia5&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot;&amp;amp;amp;gt;Bit Hacking with Go&amp;amp;amp;lt;/a&amp;amp;amp;gt;。 &amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;blockquote&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;英文原文網址:https://dev.to/vladimirvivien/bit-hacking-with-go&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;amp;lt;/blockquote&amp;amp;amp;gt;&amp;amp;amp;lt;p&amp;amp;amp;gt;更多程式相關知識,請造訪:&amp;amp;amp;lt;a href=&amp;amp;amp;quot;https://www.php.cn/course.html&amp;amp;amp;quot; target=&amp;amp;amp;quot;_blank&amp;amp;amp;quot; textvalue=&amp;amp;amp;quot;编程视频&amp;amp;amp;quot;&amp;amp;amp;gt;程式影片&amp;amp;amp;lt;/a&amp;amp;amp;gt;! ! &amp;amp;amp;lt;/p&amp;amp;amp;gt;

以上是一文詳解Golang中的位元操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
go语言有没有缩进go语言有没有缩进Dec 01, 2022 pm 06:54 PM

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言为什么叫gogo语言为什么叫goNov 28, 2022 pm 06:19 PM

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

一文浅析Golang中的闭包一文浅析Golang中的闭包Nov 21, 2022 pm 08:36 PM

闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。 换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。 闭包会随着函数的创建而被同时创建。

聊聊Golang中的几种常用基本数据类型聊聊Golang中的几种常用基本数据类型Jun 30, 2022 am 11:34 AM

本篇文章带大家了解一下golang 的几种常用的基本数据类型,如整型,浮点型,字符,字符串,布尔型等,并介绍了一些常用的类型转换操作。

一文详解Go中的并发【20 张动图演示】一文详解Go中的并发【20 张动图演示】Sep 08, 2022 am 10:48 AM

Go语言中各种并发模式看起来是怎样的?下面本篇文章就通过20 张动图为你演示 Go 并发,希望对大家有所帮助!

【整理分享】一些GO面试题(附答案解析)【整理分享】一些GO面试题(附答案解析)Oct 25, 2022 am 10:45 AM

本篇文章给大家整理分享一些GO面试题集锦快答,希望对大家有所帮助!

tidb是go语言么tidb是go语言么Dec 02, 2022 pm 06:24 PM

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言是否需要编译go语言是否需要编译Dec 01, 2022 pm 07:06 PM

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境