This looks like a pretty good solution. I will play with it.
CREATE TABLE dbo.Flags
(
position INT NOT NULL PRIMARY KEY CLUSTERED CHECK (position BETWEEN -1 AND 15),
bit_value INT NOT NULL UNIQUE NONCLUSTERED,
CHECK (bit_value = POWER(2, position) OR (position = -1 AND bit_value = 0))
);
GO
-- Add 16 bits plus a placeholder to allow unset bits
INSERT dbo.Flags (position, bit_value)
SELECT TOP (16)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS position,
POWER(2, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1) AS bit_value
FROM master.sys.columns
UNION ALL
SELECT -1, 0 -- for unset bits
GO