4、-1)<<3))D.!(x&0xFF)注意,英文版中C是最低字节,D是最高字节。中文版恰好反过来了。这里是按中文版来做的。2.62这里我感觉应该是英文版对的,int_shifts_are_arithmetic()int int_shifts_are_arithmetic(){ int x= -1; return (x>>1) == -1;}2.63对于sra,主要的工作是将xrsl的第w-k-1位扩展到前面的高位。这个可以利用取反加1来实现,不过这里的加1是加1<<(w-k-1)。如果x的第w-k-1位为0,取反加1后,前面位全为0,如
5、果为1,取反加1后就全是1。最后再使用相应的掩码得到结果。对于srl,注意工作就是将前面的高位清0,即xsra&(1<<(w-k)-1)。额外注意k==0时,不能使用1<<(w-k),于是改用2<<(w-k-1)。 int sra(int x, int k){ int xsrl= (unsigned) x >> k; int w= sizeof(int)<<3; unsignedz= 1 << (w-k-1); unsignedmask=z - 1; unsignedright=mask & xsrl; unsi
6、gnedleft= ~mask & (~(z&xsrl) + z); return left
7、 right;}int srl(unsignedx, int k){ int xsra= (int) x >> k; int w= sizeof(int)*8; unsignedz= 2 << (w-k-1); return (z - 1) & xsra;}2.64int any_even_one(unsignedx){ return !!(x & (0x55555555));}2.65int even_ones(un
8、signedx){ x ^= (x>> 16); x ^= (x>> 8); x ^= (x>> 4); x ^= (x>> 2); x ^= (x>> 1); return !(x&1);} x的每个位进行异或,如果为0就说明是偶数个1,如果为1就是奇数个1。那么可以想到折半缩小规模。最后一句也可以是return(x^1)&12.66根据提示想到利用或运算,将最高位的1或到比它低的每一位上,忽然想如果x就是10000000..该如何让每一位都为1。于是便想到了二进扩展。先是x右移1位再和原x进行或,变成1100
9、000...,再让结果右移2位和原结果或,变成11110000...,最后到16位,变成11111111...。int leftmost_one(unsignedx){ x