13


8

UTL_RAW.BIT_XORを使用してBLOBに対してXOR操作を実行したデータベース(oracle 11g)に複製されたBLOBはほとんどありません。 その後、バイナリ文字列の設定ビット数を数えたいので、上記のコードを書きました。

小さな実験の間に、16進数と整数値が何であるかを見て、この手順を書きたいと思いました。

SQL> 2 3 vblob1 blobを宣言します。 4 5 BEGIN 6 7 select leftiriscode INIR vblob1 from irisdataどこからirisid = 1; 8 9 dbms_output.put_line(rawtohex(vblob1)); 10 11 12 dbms_output.put_line(UTL_RAW.CAST_TO_binary_integer(vblob1)); 13 14 15終了。 16 /

出力:16進数:

0F0008020003030D030C1D1C3C383C330A3311373724764C54496C0A6B029B84840547A341BBA83D BB5FB9DE4CDE5EFE96E1FC6169438344D604681D409F9F9F3BC07EE0C4E0C033A23B37791F59F84F F94E4F664E3072B0229DA09D9F0F1FC600C2E380D6988C198B39517D157E7D66FE675237673D3D28 3A016C01411003343C76740F710F0F4F8FE976E1E882C186D316A63C0C7D7D7D7D397F016101B043 0176C37E767C7E0C7D010C8302C2D3E4F2ACE42F8D3F3F367A46F54285434ABB61BDB53CBF6C7CC0 F4C1C3F349B3F7BEB30E4A0CFE1C85180DC338C2C1C6E7A5CE3104303178724CCC5F451F573F3B24 7F24052000202003291F130F1B0E070C0E0D0F0E0F0B0B07070F1E1B330F27073F3F272E2F2F6F7B 2F2E1F2E4F7EFF7EDF3EBF253F3D2F39BF3D7F7FFED72FF39FE7773DBE9DBFBB3FE7A76E777DF55C 5F5F7ADF7FBD7F6AFE7B7D1FBE7F7F7DD7F63FBFBF2D3B7F7F5F2F7F3D7F7D3B3F3B7FFF4D676F7F 5D9FAD7DD17F7F6F6F0B6F7F3F767F1779364737370F7D3F5F377F2F3D3F7F1F2FE7709FB7BCB77B 0B77CF1DF5BF1F7F3D3E4E7F197F571F7D7E3F7F7F7D7F6F4F75FF6F7ECE2FFF793EFFEDB7BDDD1F FF3BCE3F7F3FBF3D6C7FFF7F7F4FAF7F6FFFFF8D7777BF3AE30FAEEEEBCF5FEEFEE75FFEACFFDF0F DFFFF77FFF677F4FFF7F7F1B5F1F 5F146F1F1E1B3B1F3F273303170F370E250B

整数値:15

16進コードと生成された整数値の間に差異があったので、実際の整数値をチェックするために次のPythonコードを使用しました。

印刷INT(「0F0008020003030D030C1D1C3C383C330A3311373724764C54496C0A6B029B84840547A341BBA83D BB5FB9DE4CDE5EFE96E1FC6169438344D604681D409F9F9F3BC07EE0C4E0C033A23B37791F59F84F F94E4F664E3072B0229DA09D9F0F1FC600C2E380D6988C198B39517D157E7D66FE675237673D3D28 3A016C01411003343C76740F710F0F4F8FE976E1E882C186D316A63C0C7D7D7D7D397F016101B043 0176C37E767C7E0C7D010C8302C2D3E4F2ACE42F8D3F3F367A46F54285434ABB61BDB53CBF6C7CC0 F4C1C3F349B3F7BEB30E4A0CFE1C85180DC338C2C1C6E7A5CE3104303178724CCC5F451F573F3B24 7F24052000202003291F130F1B0E070C0E0D0F0E0F0B0B07070F1E1B330F27073F3F272E2F2F6F7B 2F2E1F2E4F7EFF7EDF3EBF253F3D2F39BF3D7F7FFED72FF39FE7773DBE9DBFBB3FE7A76E777DF55C 5F5F7ADF7FBD7F6AFE7B7D1FBE7F7F7DD7F63FBFBF2D3B7F7F5F2F7F3D7F7D3B3F3B7FFF4D676F7F 5D9FAD7DD17F7F6F6F0B6F7F3F767F1779364737370F7D3F5F377F2F3D3F7F1F2FE7709FB7BCB77B 0B77CF1DF5BF1F7F3D3E4E7F197F571F7D7E3F7F7F7D7F6F4F75FF6F7ECE2FFF793EFFEDB7BDDD1F FF3BCE3F7F3FBF3D6C7FFF7F7F4FAF7F6FFFFF8D7777BF3AE30FAEEEEBCF5FEEFEE75FFEACFFDF0F DFFFF77FFF677F4FF F7F7F1B5F1F5F146F1F1E1B3B1F3F273303170F370E250B "、16)

回答:

611951595100708231079693644541095422704525056339295086455197024065285448917042457 942011979060274412229909425184116963447100932992139876977824261789243946528467423 887840013630358158845039770703659333212332565531927875442166643379024991542726916 563271158141698128396823655639931773363878078933197184072343959630467756337300811 165816534945075483141582643531294791665590339000206551162697220540050652439977992 246472159627917169957822698172925680112854091876671868161705785698942483896808137 210721991100755736178634253569843464062494863175653771387230991126430841565373390 924951878267929443498220727531299945275045612499928105876210478958806304156695438 684335624641395635997624911334453040399012259638042898470872203581555352191122920 004010193837249388365999010692555403377045768493630826307316376698443166439386014 145858084176544890282148970436631175577000673079418699845203671050174181808397880 048734270748095682582556024378558289251964544327507321930196203199459115159756564 5073401110302852 269513930128637786703901720139137f2w中6人組9139139131213713121371312137139144w内それそれそれはすべてのすべての画像を表示します。

セットビット数を取得するために、Cで次のコードを書きました。

int bitsoncount(符号なしx){符号なしint b = 0; (x> 1)b = 1の場合。 while(x

私がPythonで同じコードを試したとき、それはうまくいきませんでした。 私は実験している好奇心を通してpythonに慣れていません、間違っているならば申し訳ありません。

def bitsoncount(x):b = 0。 (x> 1)の場合:b = 1。 while(x

最後の行にエラーが出ました。これを解決してpythonでロジックを実装するのに助けが必要です:-)

私が見たことがあった後に私はpythonでセットビットバージョンをチェックアウトすることに興味がありました!

ありがとう、Chaitanya

7 Answer


32


Python 2.6または3.0

def bitsoncount(x):bin(x)を返します。count( '1')

例:

>>> x = 123 >>> bin(x) '0b1111011' >>> bitsoncount(x)6

または

def bitsoncount(i):0 <= i <0x100000000をアサートi = i  - ((i >> 1)


9


あなたが探しているものは Hamming Weightと呼ばれています。

Python 2.6 / 3.0では、次のようにしてかなり簡単に見つけることができます。

bits = sum(b(x)[2:]内のbに対してb == '1')


4


どのバージョンのPythonを使用していますか? 最初に、Pythonはセミコロンではなく空白を使用します、それでそれを始めるためにはそれはこのようなものになるべきです…​

def bitsoncount(x):b = 0(x> 0):x


3


あなたのCアルゴリズムの直接の翻訳は以下の通りです:

def bitsoncount(x):b = 0でx> 0:x


2


多分これはあなたが言っていることですか?

def bits_on_count(x):b = 0、x!= 0:xの場合

Python 3.0でそれを単純にする方法もあります。

def bits_on_count(x):合計を返す(bin(x)のcのc == '1')

これは、bin(x)がxのバイナリ表現を与えるという事実を使用します。


0


このモジュールを試してください。

import sys
if sys.maxint < 2**32:
    msb2= 2**30
else:
    msb2= 2**62
BITS=[-msb2*2] # not converted into long
while msb2:
    BITS.append(msb2)
    msb2 >>= 1

def bitcount(n):
    return sum(1 for b in BITS if b&n)

これはマシンの整数に対しても動作するはずです(あなたのOSとPythonのバージョンによります)。 それはどんな「長い」のためにも動作しません。


0


あなたはどのようにこれを好きですか:

def bitsoncount(x):b = 0 bit = 1、bit <= x:b = int(x)

bを返す

基本的には、正しく開始され、inパラメータのビット長までシフトされるテストビットを使用します。 各位置についてビット > 0をチェックして、結果のTrue | Falseをint()で1 | 0に変換し、これをアキュムレータに追加します。 長い間うまく動作するようです:-)。