bit manipulation

what is the difference b/w

1) #define TI_ZN (1 << 1)
#define TI_ZN (1 << 2)
and
2) #define TI_ZN 2
#define TI_ZN 4

Instead of using left shift we can assign the value 2 directly?
Or there is a reason behind this to use shift operator?
:wall:

There is certainly no reason to #define TI_ZN to two different values (unless there are conditional tests to choose one setting over another based on the compilation environment) unless you're trying to confuse someone reading your source code.

Sometimes it makes sense when defining masks for bit fields or defining various parts of a value that contains bit fields to make it easier to understand the individual fields being set. For example you might find something like:

/* File type */
#define S_IFMT          (017<<12)         /* file type mask */
#define S_IFIFO         (001<<12)         /* named pipe (fifo) */
#define S_IFCHR         (002<<12)         /* character special */
#define S_IFDIR         (004<<12)         /* directory */
#define S_IFBLK         (006<<12)         /* block special */
#define S_IFREG         (010<<12)         /* regular */
#define S_IFLNK         (012<<12)         /* symlink */
#define S_IFSOCK        (014<<12)         /* socket */

on some systems in <sys/stat.h>.

1 Like

I think it's mostly semantics. If you use the shift operator, you emphasise on a certain bit pattern at a specific bit offset in a variable. In Don Cragun's example, the emphasis is on the the fact, that the values 017, 01, ... are stored at an offset of 12 bits from the least significant bit of the variable.

If you use the shift operator on variables, it is faster than a multiplication in most cases.

1 Like

Hi Don cragun, its exactly like this
#define TI_ZN_FAILOVER (1 << 1) /* bit 1 /
#define TI_ENT_PORT (1 << 2) /
bit 2 /
#define TI_ENT_WWN (1 << 3) /
bit 3 */

so why can t they assign like below
#define TI_ZN_FAILOVER 2 /* bit 1 /
#define TI_ENT_PORT 4 /
bit 2 /
#define TI_ENT_WWN 8 /
bit 3 */

They could - it's just a matter of style. Using '(1 << 3)' makes it explicitly clear that what you're dealing with a bit. They both mean the same thing to the compiler, it's just what they signal to humans reading the code that differs.

1 Like