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);
}
}