An arithmetic shift is a way of multiplying or dividing numbers. Arithmetic shifts are typically executed on binary numbers. The concept, however, is applicable to any numbering scheme.
The following is an example using decimal numbers which have ten as the base. When 250 is arithmetically shifted to the left, the resulting number is 2500, which is 250 multiplied by ten. When 250 represented using 4 digits as 0250, is arithmetically shifted to the right the resulting number is 0025, which is 250 divided by ten. So it is more correct to say that an arithmetic shift is a way of multiplying or dividing numbers by the base of the number scheme.
Binary numbers have 2 as the base; they are represented using 0s and 1s, and can be signed or unsigned. In an arithmetic left shift, the numbers are shifted by one space to the left with zero being placed at the right. In an arithmetic right shift, the numbers are shifted by one space to the right with the leftmost number being retained to the left. In general, a shift can be for "n" spaces.
In unsigned binary numbers, each position is a power of 2, so binary 1 is decimal 1, binary 10 is decimal 2, binary 100 is decimal 4, and, so on. So 0110 is decimal 6. When an arithmetic left shift is carried out, the resulting number is 1100 which is decimal 12. When an arithmetic right shift is carried out the resulting number is 0011 which is decimal 3.
As numbers can be both positive and negative, signed binary numbers are used wherein the leftmost bit is 0 for a positive number or zero, and 1 for a negative number. Thus for 4-bit numbers, 0111, which is decimal 7, is the largest positive number. The scheme most often used for negative numbers has 1111 as decimal -1 and this goes all the way down to 1000, which is decimal -8.
An arithmetic left shift on 1101, for example, which is decimal -3, results in 1010, which is decimal -6. An arithmetic right shift on 1010, which is decimal -6, results in 1101, which is decimal -3. Notice that the leftmost bit is retained.
An arithmetic shift does not always correspond to multiplication and division for each and every number in the number scheme. There are limitations at either end of the number scheme. For example, the left shift of 0111, decimal 7, gives decimal -2, and, the right shift of 1111, decimal -1, gives decimal -1.
An arithmetic shift has an inherent simplicity and a shift is much faster to carry out than normal multiplication and division. So computers support this operation using a relatively simple mechanism called a shift unit or shift register. Savvy programmers utilize this operation as long as the limitations mentioned above are either avoided or taken care of.
anon335499 Post 2 |
main() { int a=4,b=2; a=b<>2; printf("%d", a); } Please explain this program. |