'〜'在python中意味着什么?

hid*_*oto 13 python interpreter brainfuck

'〜'在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
Run Code Online (Sandbox Code Playgroud)

我想知道它是做什么的,因为我想在我的ti 84(和PF一个)上制作一个

BF是http://en.wikipedia.org/wiki/Brainfuck,PF 类似

dan*_*n04 21

Bitwise NOT, just like in C.

In two's complement representation, ~n is equivalent to -n - 1.


Nas*_*nov 14

在这个特定的上下文中,只需用'not'替换'〜'.

PS.好吧,我想我将不得不解释 - 开始得到-1的sla,可能在前提下我不知道逻辑和按位否定之间的区别.

问题是,问题中的代码被破坏了.它有一个错误.如果你检查Brainfuck应该如何工作,它会在[]括号内循环,而当前的存储单元格是!= 0(这在输入时作为前置条件被检查[并且在返回之前作为优化]).

但是,代替争论,可能更容易用代码不起作用的例子来展示.我们来看一下简单的程序'[+]'.尝试调整此应该只是退出(因为当前单元格为0,它甚至赢得进入循环).相反,如果你在这个解释器中运行它,它会进入无限循环.

所以如果我的澄清现在有意义的话,我会请你恢复你的-1票;-)

这是一个稍微美化的解释器,修复了~bug,我还添加了缺少的,输入:

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
Run Code Online (Sandbox Code Playgroud)


Cra*_*tro 10

并且提出一个没有提到的其他答案:~用户定义的类的行为可以通过覆盖__invert__方法(或者nb_invert如果你使用的是Python/C API 的插槽)来改变.


ray*_*ray 7

Just to belabor the point: the '~' is called a tilde.

  • 如果我没有给你免费代表,我会给你+1. (2认同)

Dav*_*ver 5

~按位不是。

我真的想不出一个好的方法来说明它(除非你知道这-1是 的按位否定0),但是维基百科条目非常好。