作者: Bruce.
日時: 2007/11/04(00:49)
Bruce.です。

davi さんは書きました (2007/11/03 23:43):

>> set /a x=~1
> -2
> 補数(ビット反転。単項演算)

先のメールに書いたとおり、補数には二種類あります(二進数なら2の補数と
1の補数)。ビット反転によりも止まるのはこのうち1の補数の方ですが、
通常コンピュータでも散られるのは2の補数の方なので、ビット反転==
補数を求めるとしない方が良いと思います。
#まあビット反転した後で1足せばいいんですけどね

>> set /a x=1<<2
> 1<< の使い方が誤っています。
> 
> 論理シフト。
> ビットを左右にずらす(シフト)。
> →乗算・除算ができてしまうらしい。
> 
>> set /a x="1<<2"
> 4
> 
> dec bin
> 1  0000000000000001
> 2  0000000000000010
> 4  0000000000000100
> 
> ???解説きぼん。
> 2とは「2桁上げる(ずらす)」という理解で良い?
> 或いは、2進の10を掛ける、という理解?
> 考えるときの軸足をどちらに置くのが良いのか、
> イメージしづらいです。

まあ結果としては同じことですが、桁をずらすと考えた方が良いかと思います。
shift っていいますし。


>> set /a x="192>>3"
> 24
> 
> 192 11000000
> 3   00000011
> 24  00011000
> 
> 0を3個減らして、上の桁を0で埋めたように思えますが、
> その理解で良い?

シフト演算には二種類あります。
ただしシフト方向以外で。
その二種類とは、算術シフトと論理シフトです。

とはいうものの、左方向へのシフトでは算術シフトと論理シフトで変わる点は
ありません。

では右方向のシフトにおいて、算術シフトと論理シフトでどう違うかですが
おおむね以下のようなものです。

簡単のため、数値を8ビットで表します。

  1111_1111 (-1)

を、論理右シフトすると

  0111_1111

となり、算術シフトでは

  1111_1111

です。

これは、2の補数表現を使っている場合、整数値の最上位のビットは
符号ビットになります(このビットが立っていれば負の数)が、

1111_1111 を 1ビット右へシフトし 0111_1111 にしたと同時に、
符号ビットが保存されるので結果として 1111_1111 になるというわけです。

ですから、

   1001_0000

という数値を1ビット右へ算術シフトすると

   1100_1000

になります。

> でもそうすると、192は2進で理解して、「0を3個減らす」
> の部分では10進で理解して、24という結果は2進数の投影
> に過ぎないことになって、3の部分だけ11を使わないのは、
> なんだか考え方が変なのかもしれない、という不安が…。

ということで

192  1100_0000

を右へ3ビットずらすということで

24  0001_1000

ということです。

> 3   00000011

シフトの量を二進表記するのはここでは意味がないです。

> 
> ---snip----
> 
>> set /a x="64^32"
> 96
> 
> ビット単位の排他OR演算。単項演算ではない。
> 
> dec bin
> 64 1000000
> 32 0100000
> 96 1100000

xor (eorという場合も。 exclusive or 排他的 or)

Exclusive or - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/XOR


1 xor 1 → 0
1 xor 0 → 1
0 xor 1 → 1
0 xor 0 → 0


-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?
  mail kbk [at] kt.rim.or.jp
        web  www.kt.rim.or.jp/~kbk/zakkicho/
             homepage3.nifty.com/farstar/