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类似的东西
答案 0 :(得分:21)
按位NOT,就像在C中一样。
在二进制补码表示中,~n
相当于-n - 1
。
答案 1 :(得分:14)
在这个特定的上下文中,只需用'not'替换'〜'。
PS。好吧,我想我将不得不解释 - 开始得到-1的sla,可能在前提下我不知道逻辑和按位否定之间的区别。
问题是,问题中的代码是已损坏。它有一个错误。如果你检查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
答案 2 :(得分:10)
并提出一件事没有提到其他答案:可以通过覆盖~
方法(或__invert__
槽来更改nb_invert
对用户定义类的行为如果您使用的是Python / C API)。
答案 3 :(得分:7)
只是为了说明问题:'〜'被称为代字号。
答案 4 :(得分:4)
~
是按位而不是。
我无法想到一个很好的方式来说明它(除非你知道-1
是0
的逐位否定),但the wikipedia entry非常好。