# bitwise not - not what I expected

Elaine Jackson elainejackson7355 at home.com
Mon Aug 18 01:35:43 CEST 2003

```In case any fellow newbies have been following this thread, here is the finished
Nim script. It doesn't use bit-manipulation as much as I thought it would.
(Still, I got the basics straight. Thanks again to everyone who helped out!) For
a readable account of the optimal strategy for Nim, see Hardy & Wright's
"Introduction to the Theory of Numbers". Peace.

## NIM
from random import random
piles=[0,0,0]

########################################

def take(n,pileNum):
if piles[pileNum]>=n:
piles[pileNum]=piles[pileNum]-n
print piles
else:
print "illegal move"

########################################

def newGame():
for i in range(3):
piles[i]=int(9*random())+1
print piles

########################################

def indexOfMax():
returnValue=0
for i in range(1,3):
if piles[i]>piles[returnValue]:
returnValue=i
return returnValue

########################################

def leftmostBitIndex(n):
if 0<n<pow(2,29):
for i in range(1,31):
if pow(2,i)>n:
return (i-1)
else:
raise

########################################

def yourMove():
magicNum=piles[0]^piles[1]^piles[2]
if magicNum==0:
i=indexOfMax()
piles[i]=piles[i]-1
else:
magicIndex=leftmostBitIndex(magicNum)
targetIndex=(-1)
for i in range(3):
if (piles[i]>>magicIndex)%2==1:
targetNum=piles[i]
targetIndex=i
break
replacement=0
for i in range(magicIndex):
magicDigit=(magicNum>>i)%2
targetDigit=(piles[targetIndex]>>i)%2
if magicDigit==1:
replacementDigit=(magicDigit-targetDigit)
else:
replacementDigit=targetDigit
replacement=replacement+replacementDigit*pow(2,i)
newNum=targetNum-(targetNum%pow(2,magicIndex+1))+replacement
piles[targetIndex]=newNum
print piles

############ not used in this script:

def matilda(n):
if 0<=n<pow(2,29):
for i in range(1,31):
iOnes=pow(2,i)-1
if n<=iOnes:
return iOnes-n
else:
raise

```