How about:
byte x = value ? (byte) 1 : (byte) 0;
If you're talking about the most efficient way of doing it, there may be some tricks you could do with unsafe code... but is this really a bottleneck for you?
EDIT: I just realized that the conditional operator needs those casts for the operands in order to make the overall expression a byte.
EDIT: Having seen your question, there's a much better way of optimizing it IMO. Currently you'll be performing operations you don't need to either way. Try this instead:
c[i << 1] = k > 9 ? k + 0x37 : k + 0x30;
or
c[i << 1] = k + (k > 9 ? 0x37 : 0x30);
(I suspect it doesn't matter which.)
You only need to perform the comparison and then one addition - instead of two additions and two multiplications after the conversion from bool to byte.
EDIT: Having just tried this, due to potentially branch misses, this can still definitely be slower than the unsafe version... or it can be faster. Picking a random value for k in the range [0, 18), this approach takes twice as long as the unsafe code. Picking a random value for k in the range [0, 1000) (i.e. one branch is picked much more often than the other), this approach is faster than the unconditional one. So what's the pattern for your k value?
Here's some benchmark code:
using System;
using System.Diagnostics;
class Test
{
static void Main()
{
Random rng = new Random();
int[] ks = new int[100000000];
for (int i = 0; i < ks.Length; i++)
{
ks[i] = rng.Next(1000);
}
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Iteration {0}", i);
long sum = 0;
Stopwatch sw = Stopwatch.StartNew();
for (int j = 0; j < ks.Length; j++)
{
answered 2011-02-12T22:00:19.430