Consider this example:
%# some random data
x = 2.^(0:10);
y = rand(size(x));
plot(log2(x), y) %# plot on log2 x-scale
set(gca, 'XTickLabel',[]) %# suppress current x-labels
xt = get(gca, 'XTick');
yl = get(gca, 'YLim');
str = cellstr( num2str(xt(:),'2^{%d}') ); %# format x-ticks as 2^{xx}
hTxt = text(xt, yl(ones(size(xt))), str, ... %# create text at same locations
'Interpreter','tex', ... %# specify tex interpreter
'VerticalAlignment','top', ... %# v-align to be underneath
'HorizontalAlignment','center'); %# h-aligh to be centered

You can plot directly using the plot command
plot (log2(x), y)
but then your x ticks will be the logarithm rather than the actual value. You could either just change your label
xlabel('Log (base 2) of quantity X');
or you can redo the ticks manually.
xt = get(gca, 'XTick');
set (gca, 'XTickLabel', 2.^xt);
Or you can be really fancy
xticks = 10:25;
set(gca, 'XTick', xticks);
for j = 1:length(xticks)
xtl{j} = ['2^' num2str(xticks(j))];
end
set(gca, 'XTickLabel', xtl)
which will evenly space the tick marks on the log scale, and label them according to their power of 2
The reason that [2:2^1:256] is that the 2^1 just becomes 2, and so it's like you wrote [2:2:256].
Instead, you can think of [2^1 2^2 2^3 ...] as raising 2 to the powers [1 2 3 ...]. The operator that does that is .^, componentwise exponentiation: 2 .^ (1:8).
You might be interested in the function logspace. It can be used to generate any logarithmic progression. It's based on log10 - so in order to get the sequence you want, you might do:
Y = logspace(log10(2), log10(256), 8);
This should generate the vector you are looking for ([2 4 8 ... 256]). Eight elements, logarithmically spaced, starting at 2 and ending at 256. It's quite a general solution.
Here's a somewhat simpler way:
logspace[a_, b_, n_] := 10.0^Range[a, b, (b - a)/(n - 1)]
This gives a sequence starting at 10^a and ending at 10^b, with n points logarithmically spaced, as does MATLAB's logspace() function.
I don't belive there is a build in function for this, however you can easily do it using Range
fSpace[min_, max_, steps_, f_: Log] :=
InverseFunction[f] /@ Range[f@min, f@max, (f@max - f@min)/(steps - 1)]
Inverse functions are being used so it'll give warnings in cases where you should be cautius, however it works for Log and other invertible functions.
fSpace[1, 1000, 4]
{1, 10, 100, 1000}
{fSpace[1, 1000, 30, Sqrt[#] &], fSpace[1, 1000, 30]} // ListPlot

Update
I just discovered that you can in fact do even better out of the box by inverting the function only on the input range:
fSpace[min_, max_, steps_, f_: Log] :=
InverseFunction[ConditionalExpression[f[#], min < # < max] &] /@
Range[f@min, f@max, (f@max - f@min)/(steps - 1)]
This still doesn't work arbitrarily, however it does help for instance selecting the positive square root in #^2&.