# Write a program that turns every 17th bit of a text file to a 1

## CJam, 22 bytes

q256b2H#b1f|2H#b256b:c


Try it online.

Touches every 17th bit, counting from the last.

I've used STDIN and STDOUT since CJam has no file I/O. If that's not allowed, the program can be wrapped in a Bash script at the cost of 24 extra bytes:

cjam <(echo q256b2H#b1f\|2H#b256b:c)<"$1">"$2"


### How it works

q                      " Read from STDIN.                                                 ";
256b                  " Convert to integer by considering the input a base 256 number.   ";
2H#b              " Convert to array by considering the integer a base 2**17 number. ";
1f|           " Set the LSB of every integer in the array element to 1.          ";
2H#b       " Convert to integer by considering the array a base 2**17 number. ";
256b   " Convert to array by considering the integer a base 256 number.   ";
:c " Turn character codes into characters.                            ";


### Perl 59

regex substitution on bit strings:

$/=$\;$_=unpack"B*",<>;s|(.{16}).|${1}1|g;print pack"B*",\$_


usage:

perl this.pl < infile.txt > outfile.txt


## C, 125

Assumes big-endian and 16-bit integers.

Works by applying a bitwise-OR on every two bytes.

Input file is y, output is z.

unsigned a,b;main(c){void*f=fopen("y","r"),*g=fopen("z","w");while(b=fread(&c,1,2,f))c|=a,a?a/=2:(a=32768),fwrite(&c,1,b,g);}


Ungolfed

// The commented out /* short */ may be used if int is not 16 bits, and short is.
unsigned /* short */ a = 0,b;
main(/* short */ c){
void *f = fopen("y", "r"), *g = fopen("z", "w");
while(b = fread(&c, 1, 2, f)){
// __builtin_bswap16 may be used if you are using GCC on a little-endian machine.
//c = __builtin_bswap16(c);
c |= a;
if(a) a >>= 1;
else a = 32768;
//c = __builtin_bswap16(c);
fwrite(&c, 1, b, g);
}
}