Python中的'~'是什么意思?

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)上制作一个

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


再重申一遍:~ 符号称为波浪号。 - ray
4个回答

22

按位取反,就像在C语言中一样。

在二进制补码表示法中,~n 等同于 -n - 1


1
为了进行移位和掩码操作,在Python中始终假定负数的二进制补码表示。请参阅http://docs.python.org/reference/datamodel.html。 - jfs

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

1
如果 x 不等于 -1,那么 ~x 将被执行。 - mikerobi
@mikerobi:请看我的回答——我添加了解释和代码。 - Nas Banov

10

同时补充一点,其他答案中没有提到的是:对于用户自定义类,“~”运算符的行为可以通过重载__invert__方法(或者如果你使用Python/C API,则是nb_invert slot)进行更改。


5

~ 表示按位取反。

我很难想出一个好的方式来说明它(除非你知道 -10 的按位取反),但是 维基百科的文章 讲得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接