• 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!