commit 759a35c7c18993643862dda253235389b7878cc9
parent cc793257f48b24b47c5dbcc13680b34f4d66a7f2
Author: Matsuda Kenji <info@mtkn.jp>
Date: Thu, 20 Apr 2023 20:15:45 +0900
update
Diffstat:
3 files changed, 114 insertions(+), 17 deletions(-)
diff --git a/man/draft/rp2040_1.html b/man/draft/rp2040_1.html
@@ -138,17 +138,17 @@ RP2040は電源を入れるといくつかの段階(ここでは関係ないの
----------------------------------------------------------------------
000000110010001110101000000000101
|......|
- 000000110010001110101000000000101 1バイト目の結果
+ 110010001110101000000000101000000 1バイト目の結果
|......|
10000001 入力の2バイト目
----------------------------------------------------------------
- 100000100010001110101000000000101 1バイト目の結果と2バイト目のXOR
- 100000100110000010001110110110111 除数
+ 010010011110101000000000101000000 1バイト目の結果と2バイト目のXOR
+ 100000100110000010001110110110111 除数
----------------------------------------------------------------
- 000000000100001100100110110110010
- .
- .
- .
+ 000100011011010010001111100110111
+ .
+ .
+ .
</code></pre>
<p>
以上の操作は以下のようなアルゴリズムのループで実装できる。\
@@ -167,7 +167,56 @@ RP2040は電源を入れるといくつかの段階(ここでは関係ないの
上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>\
以外にすることもできる。そうした方がいろいろいいこともあるらしい。\
RP2040では<code>0xffffffff</code>を使う。\
+更にこの工程を32ビットの<code>int</code>だけで行うことを考える:
</p>
+<pre><code>\
+111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当)
+
+11111111111111111111111111111111 0xffffffff
+11100011000000000000000000000000 先頭1バイトを24ビットシフト
+-------------------------------- XOR
+00011100111111111111111111111111
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+00111001111111111111111111111110
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+01110011111111111111111111111100
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+11100111111111111111111111111000
+先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
+11001111111111111111111111110000 シフト
+00000100110000010001110110110111 除数の下位32ビット
+-------------------------------- XOR
+11001011001111101110001001000111
+先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
+10010110011111011100010010001110
+00000100110000010001110110110111 除数の下位32ビット
+-------------------------------- XOR
+10010010101111001101100100111001
+先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
+00100101011110011011001001110010
+00000100110000010001110110110111 除数の下位32ビット
+-------------------------------- XOR
+00100001101110001010111111000101
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+01000011011100010101111110001010
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+10000110111000101011111100010100 1バイト目の結果
+
+10000001 入力の2バイト目
+-------------------------------- XOR
+00000111111000101011111100010100
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+00001111110001010111111000101000
+.
+.
+.
+</code></pre>
<p>
これを実装したのが以下のコード:\
</p>
diff --git a/pub/draft/rp2040_1.html b/pub/draft/rp2040_1.html
@@ -119,17 +119,17 @@ RP2040は電源を入れるといくつかの段階(ここでは関係ないの
----------------------------------------------------------------------
000000110010001110101000000000101
|......|
- 000000110010001110101000000000101 1バイト目の結果
+ 110010001110101000000000101000000 1バイト目の結果
|......|
10000001 入力の2バイト目
----------------------------------------------------------------
- 100000100010001110101000000000101 1バイト目の結果と2バイト目のXOR
- 100000100110000010001110110110111 除数
+ 010010011110101000000000101000000 1バイト目の結果と2バイト目のXOR
+ 100000100110000010001110110110111 除数
----------------------------------------------------------------
- 000000000100001100100110110110010
- .
- .
- .
+ 000100011011010010001111100110111
+ .
+ .
+ .
</code></pre>
<p>
以上の操作は以下のようなアルゴリズムのループで実装できる。</p>
@@ -143,7 +143,55 @@ RP2040は電源を入れるといくつかの段階(ここでは関係ないの
</li>
</ul>
<p>
-これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>以外にすることもできる。そうした方がいろいろいいこともあるらしい。RP2040では<code>0xffffffff</code>を使う。</p>
+これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>以外にすることもできる。そうした方がいろいろいいこともあるらしい。RP2040では<code>0xffffffff</code>を使う。更にこの工程を32ビットの<code>int</code>だけで行うことを考える:
+</p>
+<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当)
+|......|
+11111111111111111111111111111111 0xffffffff
+11100011000000000000000000000000 先頭1バイトを24ビットシフト
+-------------------------------- XOR
+00011100111111111111111111111111
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+00111001111111111111111111111110
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+01110011111111111111111111111100
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+11100111111111111111111111111000
+先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
+11001111111111111111111111110000 シフト
+00000100110000010001110110110111 除数の下位32ビット
+-------------------------------- XOR
+11001011001111101110001001000111
+先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
+10010110011111011100010010001110
+00000100110000010001110110110111 除数の下位32ビット
+-------------------------------- XOR
+10010010101111001101100100111001
+先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
+00100101011110011011001001110010
+00000100110000010001110110110111 除数の下位32ビット
+-------------------------------- XOR
+00100001101110001010111111000101
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+01000011011100010101111110001010
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+10000110111000101011111100010100 1バイト目の結果
+
+10000001 入力の2バイト目
+-------------------------------- XOR
+00000111111000101011111100010100
+先頭1ビットが0なので1ビットシフト
+-------------------------------- シフト
+00001111110001010111111000101000
+.
+.
+.
+</code></pre>
<p>
これを実装したのが以下のコード:</p>
<pre><code>uint32_t
diff --git a/pub/rss.xml b/pub/rss.xml
@@ -5,8 +5,8 @@
<description>ウェブページの更新履歴</description>
<language>ja-jp</language>
<link>https://www.mtkn.jp</link>
-<lastBuildDate>Thu, 20 Apr 2023 11:46:06 +0900</lastBuildDate>
-<pubDate>Thu, 20 Apr 2023 11:46:06 +0900</pubDate>
+<lastBuildDate>Thu, 20 Apr 2023 20:12:16 +0900</lastBuildDate>
+<pubDate>Thu, 20 Apr 2023 20:12:16 +0900</pubDate>
<docs>https://www.rssboard.org/rss-specification</docs>
<item>
<title>Xlibで遊んでみる6</title>