- PR -

C/C++で2進数を直接変化させることはできますか

1
投稿者投稿内容
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 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++です。

よろしくお願いします。
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2004-08-02 00:41
すいません。細かいことですが
>>=
=>>
の間違いです。
Yoshi
会議室デビュー日: 2004/01/25
投稿数: 13
お住まい・勤務地: Philadelphia, United States
投稿日時: 2004-08-02 00:58
ええと、10進数を右にずらしてしまうというのがよく分かりませんが、おそらく何かを
勘違いされているようです。
このiに入っている数は、あくまでunsignedなintegerであって、何進数というのはあくまで
その数字をどう人が書き表すかだけの問題のはずです。
printfのformatで%dで十進数が、%xで16進数が得られることからもわかるはずです。
shift演算をしたときには、あくまで2進表現としての数値がshiftされた値が返されることに
なります。これが、十進数の世界から見た場合は2で掛けたか割ったかと見えるわけです。
期待通りの結果が得られないというのが、具体的にこの場合何をさしているのかがわからないので
なんともいえませんが、値としては右に6つshiftした値が得られているはずです。
logical shiftとarithemetic shiftのあたりもチェックしたほうがいいかもしれません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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);
}
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2004-08-02 10:18
すいませんだいぶ間違えてました。

最初のiの値ですがたとえば、iが10のとき、
1010ですが、そこにまた10を足します。
すると今度は10100ですが、そうではなくて10101010としたいとします。
これのやり方はどういう風にすればいいのでしょうか。
この10101010という値を元にビットでずらしていきたいのですが。

ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-08-02 10:37
基本的な疑問…。
引用:

最初のiの値ですがたとえば、iが10のとき、
1010ですが、そこにまた10を足します。
すると今度は10100ですが、そうではなくて10101010としたいとします。


では、7に7を足したら、00111111ですか? 01110111ですか?
前者は、効率の良くない方法(対数を使う)しか今思いつかないのでパス。
後者は固定ですから、単に4bitすらしてから加算するだけでは?
うっちー
常連さん
会議室デビュー日: 2001/08/22
投稿数: 25
お住まい・勤務地: 長野県
投稿日時: 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/

引用:

最初のiの値ですがたとえば、iが10のとき、
1010ですが、そこにまた10を足します。
すると今度は10100ですが、そうではなくて10101010としたいとします。


10+10=20 (1010b+1010b=10100b)です。
10+10=170? (1010b+1010b=10101010b?) それは足し算ではありません。

引用:

やりたいことはGUIDでとってきた値が32桁16進数なので、それに若干の変化を加えて
26桁まで減らして32bitまで扱えるようにしたいのですが


128bitのGUIDを32bitに圧縮したいのでしょうか?
それともBCD演算がしたいのでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)