Artikel ini akan memberi anda pemahaman yang mendalam tentang operasi bit dalam Golang, dan memperkenalkan kes yang memperincikan setiap operator dan cara menggunakannya, saya harap ia akan membantu semua orang.
Pada zaman dahulu apabila memori komputer mahal dan kuasa pemprosesan terhad, menggunakan operasi bit gaya penggodam untuk memproses maklumat adalah cara yang diutamakan (dalam beberapa kes hanya dalam dengan cara ini). Sehingga hari ini, penggunaan langsung operasi bit masih merupakan bahagian penting dalam banyak bidang pengkomputeran, seperti pengaturcaraan sistem peringkat rendah, pemprosesan grafik, kriptografi, dll. [Cadangan berkaitan: Tutorial Video Go]
Bahasa pengaturcaraan Go menyokong operator bitwise berikut:
& bitwise AND | bitwise OR ^ bitwise XOR &^ AND NOT > right shift
Baki artikel ini memperincikan setiap operator dan contoh bagaimana ia digunakan.
& Operator
Dalam Go, operator &
melakukan bitwise AND
pada dua operan integer beroperasi. Operasi AND
mempunyai atribut berikut:
Given operands a, b AND(a, b) = 1; only if a = b = 1 else = 0
AND
Operator mempunyai kesan yang baik untuk mengosongkan bit data integer secara terpilih kepada 0. Sebagai contoh, kita boleh menggunakan operator &
untuk mengosongkan (menetapkan) 4 bit paling tidak ketara (LSB) terakhir kepada semua 0.
func main() { var x uint8 = 0xAC // x = 10101100 x = x & 0xF0 // x = 10100000 }
Semua operasi bit menyokong borang tugasan yang disingkatkan. Sebagai contoh, contoh sebelumnya boleh ditulis semula seperti berikut.
func main() { var x uint8 = 0xAC // x = 10101100 x &= 0xF0 // x = 10100000 }
Helah lain yang kemas ialah: anda boleh menggunakan operasi &
untuk menguji sama ada nombor itu ganjil atau genap. Sebabnya ialah apabila bit terendah nombor ialah 1, ia adalah nombor ganjil. Kita boleh menggunakan nombor dan 1 untuk melakukan operasi &
, dan kemudian melakukan operasi AND
dengan 1. Jika hasilnya ialah 1, maka nombor asal ialah nombor ganjil
import ( "fmt" "math/rand" ) func main() { for x := 0; x <p> dalam <a href="https://play.golang.org/p/2mTNOtioNM" target="_blank"> Jalankan contoh di atas di Taman Permainan</a></p><h4> <span class="header-link octicon octicon-link"></span><strong>| Operator</strong> </h4><p><code>|</code> melakukan bitwise Operasi. Ingat bahawa pengendali <code>或</code> mempunyai sifat berikut: <code>或</code></p><pre class="brush:php;toolbar:false">Given operands a, b OR(a, b) = 1; when a = 1 or b = 1 else = 0Kita boleh menggunakan operator bitwise
untuk menetapkan bit individu secara selektif untuk integer tertentu. Sebagai contoh, dalam contoh berikut kami menggunakan bitwise 或
untuk menetapkan bit ke-3, ke-7 dan ke-8 dalam nombor sampel (dari bit rendah ke bit tinggi (MSB)) kepada 1. Contoh boleh dijalankan di 或
func main() { var a uint8 = 0 a |= 196 fmt.Printf("%b", a) } // 打印结果 11000100 ^^ ^
Tapak Latihan. Operasi
berguna apabila menggunakan teknik penyamaran bit untuk menetapkan bit arbitrari untuk nombor integer yang diberikan. Sebagai contoh, kita boleh melanjutkan atur cara sebelumnya untuk menetapkan lebih banyak bit untuk nilai yang disimpan dalam pembolehubah. 或
a
func main() { var a uint8 = 0 a |= 196 a |= 3 fmt.Printf("%b", a) } // 打印结果 11000111Tapak Latihan
. Dalam atur cara sebelumnya, bukan sahaja perpuluhan 196 mesti ditetapkan bitwise, tetapi perpuluhan 3 dalam bit rendah juga mesti ditetapkan. Kita boleh meneruskan (lebih banyak nilai pada
) untuk menetapkan semua bit.或
Konfigurasi Penggunaan Operasi Bit Sekarang, mari semak
. Kita boleh menggunakan ciri ini untuk menanyakan nilai bit tetapannya. Sebagai contoh, dalam kod di atas akan mengembalikan 196 kerana nilai bit ini wujud dalam AND(a, 1) = a 当且仅当 a = 1
. Jadi kita boleh menggunakan operasi a & 196
dan a
dalam kombinasi untuk menetapkan dan membaca nilai konfigurasi bit tertentu masing-masing. .OR
AND
Coretan kod sumber berikut menunjukkan operasi ini. Fungsi
, ialah rentetan yang hendak ditukar dan yang kedua, procstr
, ialah integer yang menggunakan bitmask untuk menentukan konfigurasi penukaran berbilang. 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 <p>Kaedah </p> di atas akan menukar rentetan menjadi huruf kecil, kemudian membalikkan rentetan, dan akhirnya menambah huruf pertama perkataan dalam. rentetan Menjadi huruf besar. Fungsi ini dicapai dengan menetapkan digit kedua, ketiga dan keempat dalam <p> kepada 14. Kod kemudian menggunakan blok pernyataan if berturut-turut untuk mendapatkan operasi bit ini dan melakukan penukaran rentetan yang sepadan. <code>procstr("HELLO PEOPLE!", LOWER|REV|CAP)</code><code>conf</code></p><h4> <span class="header-link octicon octicon-link">^ operator </span><strong></strong> Dalam Go, operasi bitwise </h4> diwakili oleh <p>. Operator <code>异或</code> mempunyai ciri-ciri berikut: <code>^</code><code>异或</code></p><pre class="brush:php;toolbar:false">Given operands a, b XOR(a, b) = 1; only if a != b else = 0Ciri operasi ini boleh digunakan untuk menukar satu nilai bit binari kepada nilai yang lain. Sebagai contoh, diberi nilai perenambelasan, kita boleh menggunakan kod berikut untuk menukar 8 bit pertama (bermula dari MSB) nilai.
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;quot;a and b have same sign?&amp;amp;quot;, (a ^ b) &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;quot;%08b\n&amp;amp;quot;, a) fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, ^a) } // 打印结果 00001111 // var a 11110000 // ^a
在练习场中可以运行范例。
&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;quot;%08b\n&amp;amp;quot;, a) a &amp;amp;amp;^= 0x0F fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a) } // 打印: 10101011 10100000
在练习场中运行范例。
> 操作符
与其他 C 的衍生语言类似, Go 使用 和 <code>>>
来表示左移运算符和右移运算符,如下所示:
Given integer operands a and n, a &amp;amp;gt; n; shifts all bits in a to the right n times
例如,在下面的代码片段中变量 a
(00000011
)的值将会左移位运算符分别移动三次。每次输出结果都是为了说明左移的目的。
func main() { var a int8 = 3 fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a) fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a&amp;amp;lt;p&amp;amp;gt;在 &amp;amp;lt;a href=&amp;amp;quot;https://play.golang.org/p/_lhE8OoZxY&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;Playground&amp;amp;lt;/a&amp;amp;gt; 运行代码&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;注意每次移动都会将低位右侧补零。相对应,使用右移位操作符进行运算时,每个位均向右方移动,空出的高位补零,如下示例 (有符号数除外,参考下面的算术移位注释)。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;pre class=&amp;amp;quot;brush:php;toolbar:false&amp;amp;quot;&amp;amp;gt;func main() { var a uint8 = 120 fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a) fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a&amp;amp;gt;&amp;amp;gt;1) fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a&amp;amp;gt;&amp;amp;gt;2) } // 打印: 01111000 00111100 00011110
在 练习场中可以运行范例。
可以利用左移和右移运算中,每次移动都表示一个数的 2 次幂这个特性,来作为某些乘法和除法运算的小技巧。例如,如下代码中,我们可以使用右移运算将 200
(存储在变量 a 中)除以 2 。
func main() { a := 200 fmt.Printf(&amp;amp;quot;%d\n&amp;amp;quot;, a&amp;amp;gt;&amp;amp;gt;1) } // 打印: 100
在 练习场 中可以运行范例。
或是通过左移 2 位,将一个数乘以4:
func main() { a := 12 fmt.Printf(&amp;amp;quot;%d\n&amp;amp;quot;, a&amp;amp;lt;p&amp;amp;gt;在 &amp;amp;lt;a href=&amp;amp;quot;https://play.golang.org/p/xuJRcKgMVV&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;练习场&amp;amp;lt;/a&amp;amp;gt; 中可以运行范例。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;位移运算符提供了有趣的方式处理二进制值中特定位置的值。例如,下列的代码中,&amp;amp;lt;code&amp;amp;gt;|&amp;amp;lt;/code&amp;amp;gt; 和 &amp;amp;lt;code&amp;amp;gt; 用于设置变量 &amp;amp;lt;code&amp;amp;gt;a&amp;amp;lt;/code&amp;amp;gt; 的第三个 bit 位。&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;pre class=&amp;amp;quot;brush:php;toolbar:false&amp;amp;quot;&amp;amp;gt;func main() { var a int8 = 8 fmt.Printf(&amp;amp;quot;%08b\n&amp;amp;quot;, a) a = a | (1&amp;amp;lt;p&amp;amp;gt;可以在 &amp;amp;lt;a href=&amp;amp;quot;https://play.golang.org/p/h7WoP7ieuI&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;练习场&amp;amp;lt;/a&amp;amp;gt; 中运行代码示例。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;或者,您可以组合位移运算符和 &amp;amp;lt;code&amp;amp;gt;&amp;amp;amp;&amp;amp;lt;/code&amp;amp;gt; 测试是否设置了第n位,如下面示例所示:&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;pre class=&amp;amp;quot;brush:php;toolbar:false&amp;amp;quot;&amp;amp;gt;func main() { var a int8 = 12 if a&amp;amp;amp;(1&amp;amp;lt;p&amp;amp;gt;在 &amp;amp;lt;a href=&amp;amp;quot;https://play.golang.org/p/Ptc7Txk5Jb&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;练习场&amp;amp;lt;/a&amp;amp;gt;中运行代码。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;使用 &amp;amp;lt;code&amp;amp;gt;&amp;amp;amp;^&amp;amp;lt;/code&amp;amp;gt; 和位移运算符,我们可以取消设置一个值的某个位。例如,下面的示例将变量 a 的第三位置为 0 :&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;pre class=&amp;amp;quot;brush:php;toolbar:false&amp;amp;quot;&amp;amp;gt;func main() { var a int8 = 13 fmt.Printf(&amp;amp;quot;%04b\n&amp;amp;quot;, a) a = a &amp;amp;amp;^ (1 &amp;amp;lt;p&amp;amp;gt;在 &amp;amp;lt;a href=&amp;amp;quot;https://play.golang.org/p/Stjq9oOjKz&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;练习场&amp;amp;lt;/a&amp;amp;gt; 中运行代码。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;h4&amp;amp;gt; &amp;amp;lt;span class=&amp;amp;quot;header-link octicon octicon-link&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;/span&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt;关于算术位移运算的笔记&amp;amp;lt;/strong&amp;amp;gt; &amp;amp;lt;/h4&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;当要位移的值(左操作数)是有符号值时,Go 自动应用算术位移。在右移操作期间,复制(或扩展)二进制补码符号位以填充位移的空隙。&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;h4&amp;amp;gt; &amp;amp;lt;span class=&amp;amp;quot;header-link octicon octicon-link&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;/span&amp;amp;gt;&amp;amp;lt;strong&amp;amp;gt; Ringkasan &amp;amp;lt;/strong&amp;amp;gt; &amp;amp;lt;/h4&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Seperti pengendali moden yang lain, Go menyokong semua pengendali manipulasi bit binari. Artikel ini hanya menyediakan contoh pelbagai penggodaman yang boleh dilakukan dengan pengendali ini. Anda boleh menemui banyak artikel di web, terutamanya &amp;amp;lt;a href=&amp;amp;quot;https://graphics.stanford.edu/~seander/bithacks.html&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;Bit Twiddling Hacks&amp;amp;lt;/a&amp;amp;gt; oleh Sean Eron Anderson. &amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Ikuti Vladim &amp;amp;lt;a href=&amp;amp;quot;https://twitter.com/VladimirVivien&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;@vladimirvivien&amp;amp;lt;/a&amp;amp;gt; di Twitter. &amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Jika anda belajar Go, baca buku Vladimir Vivien on Go yang dipanggil &amp;amp;lt;a href=&amp;amp;quot;https://www.packtpub.com/application-development/learning-go-programming&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;Learning Go Programming&amp;amp;lt;/a&amp;amp;gt; . &amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Artikel ini pada asalnya diterbitkan di Medium oleh pengarang Vladimir Vivien sebagai &amp;amp;lt;a href=&amp;amp;quot;https://medium.com/learning-the-go-programming-language/bit-hacking-with-go-e0acee258827#.2hof13ia5&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot;&amp;amp;gt;Bit Hacking with Go&amp;amp;lt;/a&amp;amp;gt;. &amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;blockquote&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Alamat asal bahasa Inggeris: https://dev.to/vladimirvivien/bit-hacking-with-go&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/blockquote&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: &amp;amp;lt;a href=&amp;amp;quot;https://www.php.cn/course.html&amp;amp;quot; target=&amp;amp;quot;_blank&amp;amp;quot; textvalue=&amp;amp;quot;编程视频&amp;amp;quot;&amp;amp;gt;Video Pengaturcaraan&amp;amp;lt;/a&amp;amp;gt;! ! &amp;amp;lt;/p&amp;amp;gt;
Atas ialah kandungan terperinci Penjelasan terperinci tentang operasi bit di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Golang lebih sesuai untuk tugas -tugas kesesuaian yang tinggi, sementara Python mempunyai lebih banyak kelebihan dalam fleksibiliti. 1.Golang dengan cekap mengendalikan kesesuaian melalui goroutine dan saluran. 2. Pilihannya harus berdasarkan keperluan khusus.

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

PilihgolangforhighperformanceandConcurrency, IdealForBackEndServicesandnetworkprogramming; SelectPythonForrapidDevelopment, datascience, danMachinelearningDuetoitSversativilityAndextiveLibraries.

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Dalam apa aspek Golang dan Python lebih mudah digunakan dan mempunyai lengkung pembelajaran yang lebih lancar? Golang lebih sesuai untuk kesesuaian tinggi dan keperluan prestasi tinggi, dan lengkung pembelajaran agak lembut untuk pemaju dengan latar belakang bahasa C. Python lebih sesuai untuk sains data dan prototaip cepat, dan lengkung pembelajaran sangat lancar untuk pemula.

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golang sesuai untuk pembangunan pesat dan pengaturcaraan serentak, manakala C lebih sesuai untuk projek yang memerlukan prestasi yang melampau dan kawalan asas. 1) Model Concurrency Golang memudahkan pengaturcaraan konvensyen melalui goroutine dan saluran. 2) Pengaturcaraan templat C menyediakan kod generik dan pengoptimuman prestasi. 3) Koleksi sampah Golang adalah mudah tetapi boleh menjejaskan prestasi. Pengurusan memori C adalah rumit tetapi kawalannya baik -baik saja.

Goimpactsdevelopmentpositivielythroughspeed, efficiency, andsimplicity.1) Speed: goCompilesquicklyandrunsefficiently, idealforlargeproject.2) Kecekapan: ITSComprehensivestandardlibraryraryrarexternaldependencies, enhingdevelyficiency.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa