Possible binaries sum
Python 2, 61 bytes

k=n=0
for c in input():n=n*2+-ord(c)%3;k+=c&gt;&quot;1&quot;
print(n&lt;&lt;k)/2

Try it online!
Implements this algorithm:

Convert the input from binary, treating X as \$\frac{1}{2}\$.
Double the result for each X in the input.

Why does this work? If X appears \$k\$ times in the input, we're adding up \$2^k\$ near-copies of its binary value. Among these near-copies, each X in any position appears as 0 half the time and 1 half the time for an average of \$\frac{1}{2}\$, so we can treat X as the digit \$\frac{1}{2}\$.
In the code, we actually convert 0,X,1 to doubled values 0,1,2, then halve the result before doubling for X's. And, we use _ for X, since we're allowed to use a different character -- anything with the same ASCII code modulo 3 would work, such as the digit 2.
63 bytes

lambda s:(reduce(lambda n,c:2*n+-ord(c)%3,s,0)&lt;&lt;s.count('_'))/2

Try it online!