14

'~' は Python で何を意味しますか?

少し前にPythonでこのBFインタープリターを見つけました。

import sys

#c,i,r,p=0,0,[0]*255,raw_input()

c=0   
i=0
p=raw_input()    
r=[0]*255 

while c<len(p):
    m,n,u=p[c],0,r[i]
    if m==">":i+=1
    if m=="<":i-=1
    if m=="+":r[i]+=1
    if m=="-":r[i]-=1
    if m==".":sys.stdout.write(chr(u))  
    if m=="[":
        if ~u:
            while 1:
                m=p[c]
                if m=="]":n-=1
                if m=="[":n+=1
                if ~n:break
                c+=1
    if m=="]":
        if u:
            while 1:
                m=p[c]
                if m=="]":n-=1
                if m=="[":n+=1
                if ~n:break
                c-=1    
    c+=1

ti 84(およびPF 1)で作成したいので、それが何をするのか知りたいです

BF はhttp://en.wikipedia.org/wiki/Brainfuck で、PF は似たようなものです

4

5 に答える 5

21

C と同じように、ビットごとの NOT。

2 の補数表現で~nは、 と同等-n - 1です。

于 2010-06-12T03:47:52.093 に答える
14

この特定のコンテキストでは、'~' を 'not' に置き換えてください。

PS。わかりました、説明する必要があると思います--1で平手打ちされ始めました。おそらく、論理否定とビット単位否定の違いがわからないという前提で。

問題は、問題のコードが壊れていることです。そこにはバグがあります。Brainfuck がどのように機能するかを確認すると、現在のメモリ セルが !=0 のときに[ ]中かっこ内でループします (これは、[に入る際の前提条件として、および]から戻る前の最適化として確認されます)。

しかし、議論する代わりに、コードが機能しない例を示した方が簡単かもしれません。簡単なプログラムを見てみましょう'[+]'。これを調整しようとすると、終了する必要があります (現在のセルが 0 であるため、ループに入っても勝ちました)。代わりに、このインタープリターで実行すると、無限ループに入ります。

したがって、私の説明が意味をなす場合は、-1 票を元に戻すようお願いします ;-)

~これは、バグが修正され、欠落している,入力も追加された、わずかに美化されたインタープリターです。

from sys import stdin, stdout

bfHelloWorld = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'

# http://esoteric.sange.fi/brainfuck/bf-source/prog/yapi.b
bfPiDigits = '''>  +++++ (5 digits)
[<+>>>>>>>>++++++++++<<<<<<<-]>+++++[<+++++++++>-]+>>>>>>+[<<+++[>>[-<]<[>]<-]>>
[>+>]<[<]>]>[[->>>>+<<<<]>>>+++>-]<[<<<<]<<<<<<<<+[->>>>>>>>>>>>[<+[->>>>+<<<<]>
>>>>]<<<<[>>>>>[<<<<+>>>>-]<<<<<-[<<++++++++++>>-]>>>[<<[<+<<+>>>-]<[>+<-]<++<<+
>>>>>>-]<<[-]<<-<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+<<<-[>>+<<-]<]<<<<+>>>>>>>
>[-]>[<<<+>>>-]<<++++++++++<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+>[<<+<+>>>-]<<<
<+<+>>[-[-[-[-[-[-[-[-[-<->[-<+<->>]]]]]]]]]]<[+++++[<<<++++++++<++++++++>>>>-]<
<<<+<->>>>[>+<<<+++++++++<->>>-]<<<<<[>>+<<-]+<[->-<]>[>>.<<<<[+.[-]]>>-]>[>>.<<
-]>[-]>[-]>>>[>>[<<<<<<<<+>>>>>>>>-]<<-]]>>[-]<<<[-]<<<<<<<<]++++++++++.
'''

code = bfPiDigits   # the code
data = [0] * 255    # data memory
cp = 0              # code pointer
dp = 0              # data pointer

while cp < len(code):
    cmd = code[cp]
    if   cmd == '>': dp += 1
    elif cmd == '<': dp -= 1
    elif cmd == '+': data[dp] += 1 
    elif cmd == '-': data[dp] -= 1 
    elif cmd == '.': stdout.write(chr(data[dp]))
    elif cmd == ',': data[dp] = ord(stdin.read(1))
    elif cmd == '[' and not data[dp]: # skip loop if ==0
        n = 0
        while True:
            cmd = code[cp]
            if   cmd == '[': n += 1
            elif cmd == ']': n -= 1
            if not n: break
            cp += 1
    elif cmd == ']' and data[dp]:  # loop back if !=0
        n = 0
        while True:
            cmd = code[cp]
            if   cmd == '[': n+=1
            elif cmd == ']': n-=1
            if not n: break
            cp -= 1
    cp += 1
于 2010-06-12T20:05:20.497 に答える
10

そして、言及された他の答えのどれも持ち出さないことを1つ挙げます。~ユーザー定義クラスの動作は、__invert__メソッド(またはnb_invertPython / C APIを使用している場合はスロット)をオーバーライドすることで変更できます。

于 2010-06-12T04:54:09.530 に答える
7

要点を説明すると、「~」はチルダと呼ばれます。

于 2010-06-12T03:52:18.840 に答える
4

~はビット単位ではありません。

それを説明する良い方法は思いつきませんが (それ-1が のビットごとの否定であることがわかっている場合を除きます0)、ウィキペディアのエントリは非常に優れています。

于 2010-06-12T03:47:35.137 に答える