![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.1ベストアンサー
- 回答日時:
こんにちは。
maruru01です。ちょっと強引な方法ですが。
処理速度は確かめていません。
Dim temp As Long
Dim tempOct As String
Dim i As Long
Dim cnt As Long
temp = 222
tempOct = Oct(temp)
cnt = 0
For i = 1 To Len(tempOct)
cnt = cnt + CLng(Mid("01121223", Mid(tempOct, i, 1) + 1, 1))
Next i
MsgBox cnt
No.7
- 回答日時:
教科書に書いてある10進->2進変換の通常方法の、2で割る方法はダメですか。
エクセルVBAでテストしました。カウントする変数にn Mod 2が1であれば1を足せば良いのでは。これだと判ってるわいといわれそうですが。技術計算や数値解析の繰り返し計算の膨大なルーチンですか。「判定の時IF文がはいってしまうため処理速度が遅くなり」-今時のコンピューターで信じられない。
Sub test01()
n = Cells(1, 1)
s = "" '2進数文字列を表示するため
b = 0 '1のビットの数
For i = 1 To 16
If (n Mod 2) = 1 Then b = b + 1
s = (n Mod 2) & s
n = Int(n / 2)
If n < 2 Then GoTo p01
Next i
p01:
If (n Mod 2) = 1 Then b = b + 1
s = (n Mod 2) & s
MsgBox s
MsgBox b
End Sub
この回答へのお礼
お礼日時:2003/10/27 10:39
お礼が遅れて申し訳ございません。
皆様にまとめてお礼を申し上げさせていただきます。
たくさんの方から回答いただき感激です。
大変参考になりました。
ありがとうございます。
No.6
- 回答日時:
あ、2byte整数ね。
Private Declare Sub MoveMemory Lib "kernel32.dll" _
Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
Function BitCnt(ByVal intVal As Integer) As Long
Dim Cnt As Long
Dim lngVal As Long
Call MoveMemory(lngVal, intVal, 2) 'int型をlong型にキャスト
Do While lngVal
Cnt = Cnt + (lngVal And 1)
lngVal = lngVal \ 2
Loop
BitCnt = Cnt
End Function
No.5
- 回答日時:
bitシフトもどきの
n = n \ 2
を使う。
最上位bitをマスクする必要がある。
Function BitCnt(ByVal n As Long) As Long
Dim Cnt As Long
If (n And &H80000000) Then
Cnt = 1
n = (n And &H7FFFFFFF)
End If
Do While n
Cnt = Cnt + (n And 1)
n = n \ 2
Loop
BitCnt = Cnt
End Function
# int型で扱うよりはlong型のほうが早いかも
No.4
- 回答日時:
0~65535までの入力の場合
i = (i And &HAAAA) / 2 + (i And &H5555)
i = (i And &HCCCC) / 4 + (i And &H3333)
i = (i And &HF0F0) / 16 + (i And &HF0F)
i = (i And &HFF00) / 256 + (i And &HFF)
アセンブラ向きです。
本来は割り算でなくシフト演算使いますが、.NET以降でないと使えないようでしたので。
最初の式が一回の足し算で実質的に八回の足し算をおこなっているのがポイントです。
これは最初は1bit + 1bit = 2bitとなる計算なので
16bit幅があると2bitの演算を8つ分しています。
次は 2bit + 2bit = 4bit (3bitで十分ですが)
以下同様
条件分岐無し、データのメモリアクセス無し、加算、and、シフトは通常アセンブラ最速の命令ということで、
アセンブラレベルならこの手の方法が多分最速です。
VBだとよくわかりませんが、速い事は確かでしょう。
以前、32bit版をCで使いました。
No.3
- 回答日時:
処理速度最優先で何回も行うのでしたら、表引きがいいです。
2バイトの値→ビット1の個数の表をあらかじめ
配列で作成しておき、単純に表を参照するだけです。
実際には、2バイト用の表は結構大きいので、1バイト用の
表を作成して、上位バイト、下位バイトで2回参照するのが
お勧めかもしれません。
(#1の方のも3ビット毎の表引きですね)
実装の例(動作未確認)
private bittab(255) as integer
public function bitcount(byval a as long) as integer
・bitcount = bittab(a mod 256) + bittab(a \ 256)
end function
bitcountを使用する前に、bittab()に0~255まで答えを
初期値として設定しておく必要があります。
(初期値を計算する方法は、従来のシフトなど好きな処理で)
No.2
- 回答日時:
好ましいやり方ではないけれども、IFは使いません。
Dim lngTarget As Long
Dim lngResult As Long
lngResult = ((lngTarget And &H1) <> 0) _
+ ((lngTarget And &H2) <> 0) _
+ ((lngTarget And &H4) <> 0) _
+ ((lngTarget And &H8) <> 0) _
+ ((lngTarget And &H10) <> 0) _
+ ((lngTarget And &H20) <> 0) _
+ ((lngTarget And &H40) <> 0) _
+ ((lngTarget And &H80) <> 0) _
+ ((lngTarget And &H100) <> 0) _
+ ((lngTarget And &H200) <> 0) _
+ ((lngTarget And &H400) <> 0) _
+ ((lngTarget And &H800) <> 0) _
+ ((lngTarget And &H1000) <> 0) _
+ ((lngTarget And &H2000) <> 0) _
+ ((lngTarget And &H4000) <> 0) _
+ ((lngTarget And &H8000) <> 0)
Debug.Print lngResult / (True)
もうひとつ、あらかじめテーブルを用意しておくやり方も。
Dim lngTarget As Long
Dim intBits(256) As Integer
intBits(0) = 0
intBits(1) = 1
intBits(2) = 1
intBits(3) = 2
'...略
intBits(255) = 8
lngTarget = lngTarget And &HFFFF&
Debug.Print intBits(lngTarget \ 256) + intBits(lngTarget Mod 256)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
Python: 数値を反転させたい
-
一般のソフトで画像を扱う場合...
-
03分22秒36のような時間の単位...
-
こんにちは!verilogHDLについ...
-
命令について
-
ビット立つの意味
-
通常の表記から逆ポーランド表...
-
bit単位でのデータ読み込みプロ...
-
ビットの取り出し方法
-
ビットシフトってどんな時使うの?
-
Endianについて パート2
-
PS3に搭載されている"Cell"は、...
-
算術シフト演算が成り立つ理由...
-
浮動小数点数の内部表現につい...
-
1の補数
-
ライン数とステップ数の違いは?
-
Windowsはいったい何言語で書か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
A4 持ち込み
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
符号無し整数xを右にnビット回転
-
C言語で128bitの2進数のビット...
-
シーケンス制御についての質問...
-
PLC 命令について
-
命令について
-
Python: 数値を反転させたい
-
情報科学の飽和演算、ラップア...
-
1の補数
-
03分22秒36のような時間の単位...
-
ビット立つの意味
-
verilog 符号付加減算(最上位...
-
上位ビットと下位ビットの入れかえ
-
シーケンス制御について質問で...
おすすめ情報