maybe you could use a version of the quirky update often used for running totals, using a temp table with an extra aggVal column?
CREATE TABLE #bits (itemDate DATE, itemVal BIGINT, aggVal BIGINT);
CREATE CLUSTERED INDEX ix_bits ON #bits(itemDate);
INSERT INTO #bits
(itemDate, itemVal, aggVal)
VALUES
('01/01/2017',1,0),('01/01/2017',3,0),('01/02/2017',4,0),('01/02/2017',6,0),('01/03/2017',2,0),('01/03/2017',1,0);
-- quirky update
DECLARE @agg bigint = 0, @prev_date date = '1900-01-01';
UPDATE #bits SET
@agg = aggVal = CASE WHEN itemDate = @prev_date THEN @agg | itemVal ELSE itemVal END,
@prev_date = itemDate
OPTION (MAXDOP 1);
SELECT itemDate, MAX(aggVal) FROM #bits
GROUP BY itemDate
ORDER BY itemDate;
edit: d'oh! Luis beat me too it!