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で質問しましょう!
似たような質問が見つかりました
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- 電車・路線・地下鉄 ITパスポート試験問題 7 2023/01/25 09:51
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- その他(Microsoft Office) Excelで時間計算(負) 8 2023/02/26 05:47
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- 計算機科学 20個の量子ビットからなる量子計算機はおおよそいくつの状態を同時に表現できるか?10x の形で表現し 2 2022/12/27 14:52
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- 化学 有効数字の取り扱いについて 高校化学では、測定値同士の計算結果の有効数字は、測定値に合わせるようにな 4 2022/06/30 14:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
一般のソフトで画像を扱う場合...
-
C言語やC++言語でビット毎に値...
-
2の補数
-
「ひまわり」と「なでしこ」の違い
-
IEEE規格浮動小数点について
-
実数rの3乗はどうするの?
-
算術シフト演算が成り立つ理由...
-
verilog 符号付加減算(最上位...
-
ビットシフトってどんな時使うの?
-
光コンピュータについて
-
このような計算はできるでしょ...
-
[VBS] 素早くローテート演算したい
-
成人してから
-
ライン数とステップ数の違いは?
-
レジストってなんですか?
-
C++ のDLLがdelphiで読めない
-
実行ファイルからソースはみれる?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
命令について
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
符号無し整数xを右にnビット回転
-
verilog 符号付加減算(最上位...
-
算術シフト演算が成り立つ理由...
-
03分22秒36のような時間の単位...
-
C言語で128bitの2進数のビット...
-
1の補数
-
C言語やC++言語でビット毎に値...
-
16ビットCPUで32ビットの計算方法
-
PLC 命令について
-
アクセス(2003)のVBAでビット...
-
Python: 数値を反転させたい
-
整数除算の意味とは?
-
シーケンス制御についての質問...
おすすめ情報