搜尋
首頁後端開發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刪除
了解Goroutines:深入研究GO的並發了解Goroutines:深入研究GO的並發May 01, 2025 am 12:18 AM

goroutinesarefunctionsormethodsthatruncurranceingo,啟用效率和燈威量。 1)shememanagedbodo'sruntimemultimusingmultiplexing,允許千sstorunonfewerosthreads.2)goroutinessimproverentimensImproutinesImproutinesImproveranceThroutinesImproveranceThrountinesimproveranceThroundinesImproveranceThroughEasySytaskParallowalizationAndeff

了解GO中的初始功能:目的和用法了解GO中的初始功能:目的和用法May 01, 2025 am 12:16 AM

purposeoftheInitfunctionoIsistoInitializeVariables,setUpConfigurations,orperformneccesSetarySetupBeforEtheMainFunctionExeCutes.useInitby.UseInitby:1)placingitinyourcodetorunautoamenationally oneraty oneraty oneraty on inity in ofideShortAndAndAndAndForemain,2)keepitiTshortAntAndFocusedonSimImimpletasks,3)

了解GO界面:綜合指南了解GO界面:綜合指南May 01, 2025 am 12:13 AM

Gointerfacesaremethodsignaturesetsthattypesmustimplement,enablingpolymorphismwithoutinheritanceforcleaner,modularcode.Theyareimplicitlysatisfied,usefulforflexibleAPIsanddecoupling,butrequirecarefulusetoavoidruntimeerrorsandmaintaintypesafety.

從恐慌中恢復:何時以及如何使用recover()從恐慌中恢復:何時以及如何使用recover()May 01, 2025 am 12:04 AM

在Go中使用recover()函數可以從panic中恢復。具體方法是:1)在defer函數中使用recover()捕獲panic,避免程序崩潰;2)記錄詳細的錯誤信息以便調試;3)根據具體情況決定是否恢復程序執行;4)謹慎使用,以免影響性能。

您如何使用'字符串”包裝操縱串中的琴弦?您如何使用'字符串”包裝操縱串中的琴弦?Apr 30, 2025 pm 02:34 PM

本文討論了使用GO的“字符串”軟件包進行字符串操作,詳細介紹了共同的功能和最佳實踐,以提高效率並有效地處理Unicode。

您如何使用'加密”在Go中執行加密操作的軟件包?您如何使用'加密”在Go中執行加密操作的軟件包?Apr 30, 2025 pm 02:33 PM

本文使用GO的“加密”軟件包詳細介紹了加密操作,討論了安全實施的關鍵生成,管理和最佳實踐。

您如何使用'時間”處理日期和時間的包裝?您如何使用'時間”處理日期和時間的包裝?Apr 30, 2025 pm 02:32 PM

本文詳細介紹了GO的“時間”包用於處理日期,時間和時區,包括獲得當前時間,創建特定時間,解析字符串以及測量經過的時間。

您如何使用'反映”包裹檢查GO中變量的類型和值?您如何使用'反映”包裹檢查GO中變量的類型和值?Apr 30, 2025 pm 02:29 PM

文章討論了使用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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),