1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT(ドス・バット

bat バッチビット操作のサンプルコード

2022-01-08 23:52:09

バッチ処理におけるセット/aビット演算の概念があやふやな初心者が多いようですが、私もそうです。「異なる、または、論理シフトを伴う」なんて、とても分かりにくくて頭が混乱しそうなので、コードを紹介します。

@echo off
if "%~1" equ "" exit/b
:begin
setlocal enabledelayedexpansion
set "Var=0123456789ABCDEF"
set/p number=Input: 
if /i "%number%" equ "cls" cls&endlocal&goto begin
if "%~1" equ ">>" (set "s=!number: ="^>^>"! ") else (
    if "%~1" equ "<<" (set "s=!number: ="^<^<"! ") else (
       set "s=!number: ="^%~1^"! "
))
set/a s=!s!
for %%a in (%number% %s%) do (
     set/a num=%%a,y+=1
     set "bin="
     call :loop
     if !y! equ 2 (set "str= (%~1) %%a") else (set "str= %%a")
     set "bin=000000000000000000000000000000000!bin!"
     if !y! equ 3 echo ------------------------------------------------------
     echo !str:~-15! ^(bin^) !bin:~-30!
)
endlocal
echo.&goto begin
:loop
set/a Mod=Num%%2,Num/=2
call,set "bin=%%Var:~%Mod%,1%%%bin%"
if %Num% neq 0 goto loop

使用方法は図をご参照ください。

画像

このバッチは入力メッセージのタイポ処理を行わないので、08, 09, 0x9k abcのような無効なテキストは入力しないでください。

初回実行時は必ずパラメータを入力してください。例えば、>>右シフト操作を知りたい場合は、CMDを開き、バッチ名「>>」と入力し、以降入力された情報は>>右シフト操作を行います。他の操作を行いたい場合はCTRL+Cで終了し、再度このバッチを実行してください。

ビット差演算を行いたい場合は、上記と同様にバッチ名"^"を入力します。
演算子はすべて特殊文字であるため、""で閉じています。

例 例えば、19"&"2の操作情報を知りたい場合、CMDを開き、バッチ名"&"を入力します。
入力プロンプトを待ち、タイプします。19 2 Enter すると、19 "&" 2 の結果が表示されます。
で、2進数に変換し、対応するビットに乗算します。
その他、同じような理屈で、うまくいけば結果から各演算子の意味をまとめることができます。

バッチ式のビット演算は、プログラミング言語のビット演算と何か違うのでしょうか?記号が違うだけです

"ビット操作 "という概念や "バイナリ "という概念に触れていない人が多いということです。

実際、一般的なコンピュータの本には、基本的な逆符号、補数の概念などが紹介されていますが、飛ばしてしまった人も多いと思います(汗、当初は私もそうでした)

オリジナルコード、逆コード、補数コードについての雑感

私は、このタイトルを見た誰もが気にしないことを信じて、任意のコンピュータの基本的な本の最初の章では、それらの説明がありますが、本の中で我々は唯一のいくつかの簡単な定義、すぐに忘れた後に読むための時間を見つけることができませんので。最近、フォーラムで一部の人々は、これらの概念について尋ね、多くの人々の応答が以前に特定の本かそうを見て忘れて読んでいる参照してください、いくつかは、合理的な説明を与えている。だから私は(神は笑うだろうが、私はまだ考えなければならない)と思うようになったので、次の結論に来た。

数値は、コンピュータでは機械番号という形で表現され、コンピュータは2進数を使って0と1しか認識できないが、日常生活では10進数を使う。「アリストテレスが昔指摘したように、今日10進数が広く採用されているが、この解剖学的事実として、我々の大多数は10本の指を持って生まれてきている」。指の数え方(5,10進法)が、2進法や3進法よりも歴史的に遅く出現したにもかかわらず、である。" (時間があるときに読むと面白い「数学の歴史」より)。2進数との変換を容易にするために、16進数(2 4 )や8進数(2 3 )が使われる。以下、本題です。

コンピュータは、数値の最上位ビットに符号(0はプラス、1はマイナス)を格納します。これが機械番号の元の符号である。機械が8ビット、つまりワード長1バイトを扱えると仮定すると、元のコードで表現できる値の幅は

(-127~-0 +0~127) 合計256個。

この数値表現を用いると、数値に対する算術演算が可能になる。しかし、符号付きビットのオリジナルコードでは、乗算・除算は正しい結果が得られるが、加算・減算は次のような問題があることがすぐに判明した。ワード長を8ビットとした場合

( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)オリジナル+(10000001)オリジナル=(10000010)オリジナル=( -2 )は明らかに間違っています。

2つの整数の足し算には問題がないので、符号ビットを持つ負の数に問題があり、符号ビット以外のビットを反転して逆符号を作成する。逆符号は原符号と同じ値空間を持ち、1つ1つ対応させる。逆符号の減算演算は次のようになる。

( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10

(00000001) 逆数 + (111111110) 逆数 = (1111111) 逆数 = ( -0 ) の問題です。

( 1 )10 - ( 2)10 = ( 1)10 + ( -2)10 = ( -1)10

(00000001) 逆数 + (11111101) 逆数 = (11111110) 逆数 = ( -1 ) 正数

問題は(+0)と(-0)で、人々の計算の概念では正のゼロと負のゼロに違いはないのである。(ゼロを目印にして算術に落とし込んだのはインド人が最初で、インドの数学とゼロ記号を使った十進法は人類の文明に大きく貢献した)。

こうして、補数という概念が導入された。負の数の補数は、正の数はそのままに、その逆数に1を加えたものであり、正の数の元の逆数の補数は同じである。補数コードでは、(-0)の代わりに(-128)が使われるので、補数コードの範囲は次のようになる。

(-128~0~127)で合計256個になります。

注:(-128)は対応する主コードと逆コードがなく、(-128)=(10000000) 補数コードは以下のように加減算される。

( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

(00000001)補数 + (1111111)補数 = (0000000000) 補数 = ( 0 )正解

( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10

(00000001) 補数 + (1111111) 補数 = (1111111) 補数 = ( -1 ) correct

つまり、補数コードは、そのように設計されているのです。

(1)符号ビットをrms部分と一緒に演算に参加させ、演算ルールを簡略化すること。

(2) 減算演算を加算演算に変換し、コンピュータにおける演算子の配線設計をさらに簡素化すること。

これらの変換はすべてコンピュータの最下層で行われるが、アセンブリやC言語など他の高級言語では、元のコードをそのまま使用する。以上を読んで、あなたはオリジナルコード、インバースコード、コンプリメントコードについて新たに理解したはずです