aboutsummaryrefslogtreecommitdiff
path: root/sys/osb/shift.c
blob: 86eacfb3bff9b6892b6ff2b178a644536c80fb3e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
 */

#define	import_spp
#define import_knames
#include <iraf.h>

/*
 * SHIFT.C -- Bitwise shift operators.  A positive bitshift shifts to the left,
 * zero-filling at the right, i.e., a left shift by 1 is equivalent to a
 * multiplication by 2 (but does not cause integer overflow).  A negative shift
 * shifts to the right and is equivalent to a division.
 */

/* SHIFTI -- Bitwise boolean SHIFT of two integer variables.
 */
XINT
SHIFTI (
  XINT	*a_a,			/* operand to be shifted	*/
  XINT	*a_bits 		/* number of bits to shift	*/
)
{
	register XINT	a = *a_a, bits = *a_bits;
	return (bits > 0 ? (a << bits) : (a >> -bits));
}

/* SHIFTS -- Bitwise boolean SHIFT of two short-integer variables.
 */
XSHORT
SHIFTS (
  XSHORT *a_a,			/* operand to be shifted	*/
  XSHORT *a_bits 		/* number of bits to shift	*/
)
{
	register XSHORT	a = *a_a, bits = *a_bits;
	return (bits > 0 ? (a << bits) : (a >> -bits));
}

/* SHIFTL -- Bitwise boolean SHIFT of two long-integer variables.
 */
XLONG
SHIFTL (
  XLONG	*a_a,			/* operand to be shifted	*/
  XLONG	*a_bits 		/* number of bits to shift	*/
)
{
	register XLONG	a = *a_a, bits = *a_bits;
	return (bits > 0 ? (a << bits) : (a >> -bits));
}