- - PR -
C/C++で2進数を直接変化させることはできますか
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-02 00:40
C言語の世界で、2進数のビットを直接いじる方法はあるのでしょうか。
たとえば、11111111という値を右に6ビットずらして、00000011となった値から その答えが3であると得る方法はあるのでしょうか。 たとえば、 int i; //iは適当な値 char c[] = {'a','b',,,,'z'}; i >>= 6; printf(%c",c[i]); とやれば10進数を右に6ずらして計算してしまうので、期待通りの答えは得られません。 これを直接2進数でビット計算したいとき、どのようにすればいいのでしょうか。 あるいはマスクで、ビット計算して思い通りの数字を得るのでしょうか。 やりたいことはGUIDでとってきた値が32桁16進数なので、それに若干の変化を加えて 26桁まで減らして32bitまで扱えるようにしたいのですが、その途中でどうしても2bitの直接演算が 必要になってきたのです。 環境はVC++です。 よろしくお願いします。 | ||||||||
|
投稿日時: 2004-08-02 00:41
すいません。細かいことですが
>>= =>> の間違いです。 | ||||||||
|
投稿日時: 2004-08-02 00:58
ええと、10進数を右にずらしてしまうというのがよく分かりませんが、おそらく何かを
勘違いされているようです。 このiに入っている数は、あくまでunsignedなintegerであって、何進数というのはあくまで その数字をどう人が書き表すかだけの問題のはずです。 printfのformatで%dで十進数が、%xで16進数が得られることからもわかるはずです。 shift演算をしたときには、あくまで2進表現としての数値がshiftされた値が返されることに なります。これが、十進数の世界から見た場合は2で掛けたか割ったかと見えるわけです。 期待通りの結果が得られないというのが、具体的にこの場合何をさしているのかがわからないので なんともいえませんが、値としては右に6つshiftした値が得られているはずです。 logical shiftとarithemetic shiftのあたりもチェックしたほうがいいかもしれません。 | ||||||||
|
投稿日時: 2004-08-02 08:41
どういう期待値に対して、どんな値が得られたか、ということを書いてもらえれば、理解しやすいのですが。
なんとなく、例えばiが1の時にbが表示されていれば、hが欲しいのでしょうか。で、i>>=6とすると、aになると。 私だったら、こんな風に書くかな。 if (n > 0) { i = (i + n) % c.size; // size ? length ? } else if (n < 0) { i = (i + n < 0 ? c.size - i + n : i + n); } | ||||||||
|
投稿日時: 2004-08-02 10:18
すいませんだいぶ間違えてました。
最初のiの値ですがたとえば、iが10のとき、 1010ですが、そこにまた10を足します。 すると今度は10100ですが、そうではなくて10101010としたいとします。 これのやり方はどういう風にすればいいのでしょうか。 この10101010という値を元にビットでずらしていきたいのですが。 | ||||||||
|
投稿日時: 2004-08-02 10:37
基本的な疑問…。
では、7に7を足したら、00111111ですか? 01110111ですか? 前者は、効率の良くない方法(対数を使う)しか今思いつかないのでパス。 後者は固定ですから、単に4bitすらしてから加算するだけでは? | ||||||||
|
投稿日時: 2004-08-02 14:07
何度読んでみても、スレ主さんの言うことが理解できないのですが・・。
日本語の表現と、コンピュータの理解との両方に問題があるように思います。 このままでは誰にも理解してもらえないと思うので、以下の本でも読まれてはどうでしょうか。 「コンピュータはなぜ動くのか」 http://www.amazon.co.jp/exec/obidos/ASIN/4822281655/ 「プログラムはなぜ動くのか」 http://www.amazon.co.jp/exec/obidos/ASIN/4822281019/ 「日本語の作文技術」 http://www.amazon.co.jp/exec/obidos/ASIN/4022608080/
10+10=20 (1010b+1010b=10100b)です。 10+10=170? (1010b+1010b=10101010b?) それは足し算ではありません。
128bitのGUIDを32bitに圧縮したいのでしょうか? それともBCD演算がしたいのでしょうか? |
1