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/